Mysql数据库表锁 乐观锁

1. 乐观锁(所有用户都可以读取和修改,通过版本控制谁的修改有效)

当先执行查询再执行修改的时候出现并发情况,会修改相同数据,导致结果不对。

select * from order where id = 1;
update order set num = num+1 where id = 1;

并发时,同时查出来的num结果为1;修改的时候num都是相同值,一条执行结果为未修改。

乐观锁解决方式:

在数据库表字段增版本控制 或者直接使用修改时间字段作为参数
(时间字段的好处是每次修改成功自动更新修改时间字段则可以不用在sql中加入修改)。
order表
id num version update_time

select * from order where id = 1;
update order set num = num+1,version = version+1 where id = 1 and version = 1;
select * from order where id = 1;
update order set num = num+1,version = version+1 where id = 1 and version = 1;

并发时,同时查出来的num结果为1,version结果为1,由于第一条sql修改已经执行。数据库实际version的结果为2了。第二条sql修改则失败。

结论:由于第一条修改sql已经执行,这个时候已经开启了乐观锁,所以第二条修改sql则执行失败。

2. 死锁
所谓死锁:是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。

解除正在死锁的状态有两种方法:

第一种:

1.查询是否锁表

show OPEN TABLES where In_use > 0;

2.查询进程(如果您有SUPER权限,您可以看到所有线程。否则,您只能看到您自己的线程)

show processlist;

3.杀死进程id(就是上面命令的id列)

kill id

第二种:

1:查看当前的事务

SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX;

2:查看当前锁定的事务

SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;

3:查看当前等锁的事务

SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;

4:杀死进程

kill id

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值