一、mysql 行锁模拟
1、mysql锁简单说明
Mysql InnoDB行锁有2种,2者不能共存:
共享锁Shared(S) lock,用于读取行记录
互斥锁或叫排它锁Exclusive Lock (X),用于更新、删除行记录
2、先模拟一个行锁。
先用mysql命令框,开启一个事务并执行一条更新语句,但是不提交,如下:
mysql> use saas_tst;
mysql> begin;
mysql> update base_goods set sale_price = 46 where sid = 214;
然后用sqlyog客户端,依然执行上述更新语句,如下:
mysql> update base_goods set sale_price = 47 where sid = 214;
更新操作被阻塞,等很久后,会报ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction.
2、再来模拟一个死锁情况
模拟步骤:
1)用户A开启事务,read一行
mysql> begin;
mysql> select * from base_goods where sid = 214 lock in share mode;
说明: lock in share mode是为了加共享锁,其它事务仍然可以读取,如果是for update则变成互斥锁了,其它事务不能读取。<