论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、在存储过程执行过程中查询此条数据,则需要等到事务处理完成之后才会开始执行更新操作

论Select 语句中加for update行锁_第1张图片

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

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

论Select 语句中加for update行锁_第2张图片

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

你可能感兴趣的:(数据库)