时间:2021-07-01 10:21:17 帮助过:20人阅读
这种适用于读多,写少,并且写有可能会用很长时间的情况。
比如有两个事物:
事物1
update table1 set name=‘1‘ where id=1;
// sleep 1
update table1 set name=‘2‘ where id=2;
commit;
事物2
update table1 set name=‘2‘ where id=2;
// sleep 2
update table1 set name=‘1‘ where id=1;
commit;
上面的语句如果恰巧一起执行到sleep1 和sleep2,那么就会造成死锁。 一般有三种做法解决:
执行select .. from where id between这样的语句的时候锁定这一区间,不能插入或者删除数据,以防止幻读。
mysql维护一个系统版本号,每次有新的事物开始的时候递增。
每行后面保存两个隐藏列。 一个创建时版本号C,一个删除时版本号D
set autocommit=0;
begin;
SELECT * FROM biz_pay_task where id = 1 FOR UPDATE;
// wait
commit;
事务2
set autocommit=0;
begin;
SELECT * FROM biz_pay_task where id = 1 LOCK IN SHARE MODE;
commit;
事务2在执行SELECT LOCK IN SHARE MODE的时候会阻塞,知道事务1commit之后才会完成。
版权声明:本文为博主原创文章,未经博主允许不得转载。
mysql第二天 锁
标签:锁