Mysql InnoDB锁

行锁模式以及加锁方法:

共享锁:X锁

lock in share mode:共享锁(x锁):多个事务都可以获得同一把锁,但是只能读取不能修改。

开启两个事务,set autocommit=0的含义是设置当前session禁止自动提交,需要显示commit才可以提交。详见:https://www.cnblogs.com/langtianya/p/4777662.html

表结构(自己去建表啊...):

首先对sessionA添加lock in share mod,

这时共享锁就已经添加上了,sessionB仍然可以查询记录并且可以添加lock in share mode

 SessionA对当前Session进行update修改数据时就会进入死锁状态(看当前语句已经没有反应了并且右下角的查询时间在一直增加)

在SessionB中对锁住的这行记录进行修改时就可以解除死锁状态,SessionB中输出DeadlockFound....

此时SessionA就获得锁可进行更新操作了。。。,再次执行SessionA中的update语句发现可以进行更新了

最后SessionA进行commit提交就会发现数据库已经成功修改了

 

排他锁(X):一个事务获取了数据行的排他锁,其他事务就不能再获取该数据行的共享锁和排他锁,但是获取到排他锁的数据可以对数据进行修改和读取。

 开启了事务A事务B,事务B对数据行加了排他锁,事务A可以查询出数据。

事务A对数据行也加了排他锁,此时事务A就会进入等待状态,陷入死锁

事务B可以对数据行进行修改,提交commit后更改数据,此时释放排他锁。

事务A可以查询出更改后的数据

参考了两篇写的很好的博客:

https://www.cnblogs.com/aipiaoborensheng/p/5767459.html

https://www.cnblogs.com/boblogsbo/p/5602122.html

原文地址:https://www.cnblogs.com/javazyh/p/10697562.html