锁机制
悲观锁
1,读锁/共享锁 lock table t read
自己:能读,不能写
别人:能读,写等待
2,写锁/排它锁 lock table t write
自己:能读,能写
别人:读等待
解锁:unlock tables
select 自动加读锁
update,delete,insert 自动加表锁
粒度:
mysiam:表锁
innodb:有索引行锁,没有索引表锁
乐观锁
update set num = num-1 where id = 1 and num > 0
读锁/共享锁:lock in share mode
别人可读,不可写
写锁/排他锁:for update
别的不可读,也不可写,处于等待中,update,del,insert都会自动添加排他锁
乐观锁:本身没有加锁
通过版本控制实现:update user set age= 25, version = version + 1 where id = 1 and version = 0
悲观锁:加锁操作 lock,for update,lock in share mode,还有行锁,表锁等
死锁:
事务A
update user set age = 21 where id = 1
update user set age = 22 where id = 2
事务B
update user set age = 21 where id = 2
update user set age = 22 where id = 1
事务A跟事务B都执行了第一句,执行第二局的时候,都被对方锁定而处于等待中
解决方案:回滚其中一个事务,超时就回滚
show engine innodb status 查看最近的死锁
innoDB Lock monitor 控制台打开锁监控,比较浩性能
innodblockwait_timeout 设置死锁回滚超时
浙公网安备 33010602011771号