MySQL中innodb的锁

请问innodb引擎中,当使用update或者insert或者delete语句时,如果没有声明事务的话,数据库会给影响的行加锁么?具体机制是怎么样的?

阅读 3.1k
4 个回答

innodb中不存在你说的情况。可见官方文档说明:

In InnoDB, all user activity occurs inside a transaction.

也就是说,在innodb中,你的语句肯定在事务中。可分为如下几种情况:

  1. 显示声明事务: begin or start transaction

    当显示的声明事务就会隐式的关闭了自动提交,参见官方文档
  2. 未显示声明事务 & set autocommit=1 : 每一条sql就会是一个事务。
  3. 未显示声明事务 & set autocommit=0 : 连接中的事务总是处于打开状态,当commit或者rollback时事务完成并开启一个新事务。

只要你执行update、delete,任何DML,都会有行锁。
区别在于你的实例是否自动提交,即看autocommit是怎么设置的
1.autocommit=1,当你执行update时,加行锁,语句执行完了,事务就自动提交,那么行锁也就释放了;
2.autocommit=0,当你执行update时,加行锁,语句执行完了,如果不commit,也不rollback,那么行锁将一直持续到你结束事务为止。

行级锁只对索引有效,没索引直接表锁。

另外“行级锁”不一定只有一行。

事务本身和锁没有任何关系啊...
锁是语句行为,只不过在事务里锁要等事务提交才会释放而不是语句结束就释放

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题