标签:mysql
声明:本栏目所使用的素材都是凯哥学堂VIP学员所写,学员有权匿名,对文章有最终解释权;凯哥学堂旨在促进VIP学员互相学习的基础上公开笔记。
mysql锁机制分为表级锁和行级锁 myISAM 引擎不支持事物!
Set Autocommit=0; // 把事物设置成手动事物!
排他锁又称为写锁,简称X锁 排他锁就是不能与其他锁并存,如A事务获取了一行数据的排他锁,事务就不能再获取该行的其他锁 必须等A事物的排他锁结束才能对一行数据进行增删改! mysql InnoDB引擎默认的修改数据语句,update,delete,insert都会自动给涉及到的数据加上排他锁,select语句默认不会加任何锁类型,如果加排他锁可以使用select ...for update语句
下图两个用户都设置了手动事物 实验证明 A 把数据删了 B还能查到 B也要进行commit 提交或者roll回滚才能看到修改后的数据!
A事物还在执行 B事就对这行数据进行操作 B事物卡住在这里!
A把sid=1的数据改成了2
然后b要把sid的数据改成5 结果失败了 原因是已经没有sid=1 这条数据了
早就被A修改成2了
如果B的条件是 把sid=2的数据修改成5 那就能操作成功了!
A把查询出来的数据加上排他锁
B也对这条数据去加排他锁
然后卡住了
要等A执行commit提交 A的排他锁才能结束!
排他锁 A用户已经把这个表用排他锁锁住了
B用户去修改数据 然后卡在这里
要等A用户执行Commit 提交 B用户才能执行
再看看下图 结果是10
因为A用户把sid改成10
B用户的条件是sid=1
没有此条数据 所以修改不上!
Lock in share mode
第一 共享锁不能与排他锁共存在!
第二 共享锁在自动事物的情况下不会发生冲突
第三 共享锁在手动事物的情况下会出现一系列问题!
第四 共享锁可以多个用户对同一条记录锁定!
在手动事物的情况下 A先对这一行数据进行了排他锁 然后B用户又去对这行数据进行共享锁 死活不给B用户操作 要等A用户把这个事物处理完才能给B用户进行排他锁! 反之结果还是一样 排他锁和共享锁不能共存!
在手动事物下 A和B 都对这一条数据加上共享锁了 然后A事务要修改 会处于等待状态 他在等B用户来操作 只要B一来操作 系统就会把B用户掐死掉 先来的成功执行 后来的直接被干掉
A用户对sid=1记录共享锁锁定
B用户对Sid=2记录共享锁锁定
然后A用户去修改sid=2的记录 卡住在那里
等B来操作 B一来操作 B就完蛋了!
这个故事告诉我们 被干掉总是B用户!
双方各锁了一条数据
A对B锁定的数据进行更改
A处于等待
B对A的数据进行改变
B用户的锁干掉了
最后两个人都把事物提交或者回滚
就能查询出真实数据了!
后执行的遭殃 直接被干掉了!
标签:mysql