论Select 语句中加for update行锁

以mysql做实践。

InnoDB存储引擎既支持行级锁(row-level locking),也支持表级锁,但默认情况下是采用行级锁。

在Select语句中加for update是给相应的行增加排他锁。Select出来的数据别的事务不能读取,不能修改、不能删除。

1、在mysql中执行以下存储过程,存储过程中建了事务。

DROP PROCEDURE if exists test_lock;
DELIMITER ;;
CREATE PROCEDURE test_lock()
BEGIN
START TRANSACTION;
select * from gl_account_document where id=80128 for update;
select sleep(30);
COMMIT;
END;;
CALL test_lock();

2、在存储过程执行过程中查询此条数据,则需要等到事务处理完成之后才会开始执行更新操作


注:如果是未启用事务的查询是不需要等事务处理完成之后再执行查询操作的。而且,如果启用的事务里的查询语句未加for update也是不需要等到事务处理完成之后再执行查询操作的。

3、在存储过程中修改此条数据,则需要等到事务处理完成之后才会开始执行更新操作。


总结:使用for update可解决高并发情况下对数据进行错误更新。解决“数据覆盖”问题,解决死锁问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值