mysql手动对表或记录进行上锁处理

前言

在实际开发中会因为记录或表锁死导致程序问题,为了复现问题的原因我们需要手动对表或记录进行锁死操作。

表锁死操作:

LOCK TABLES table_name read local; 将当前表设置为只读,不能进行插入或更新操作。

UNLOCK TABLES;锁住表了,使用UNLOCK进行释放。

注意:LOCK可以在数据库不支持事务引擎时使用,否则推荐以下用法,LOCK表之后,在执行的操作会一直等待UNLOCK执行,不会抛出异常并进行中断。详细说明可见点击打开链接

对记录进行锁死操作:

对记录进行锁死稍微复杂些,我们需要用到 select * from table_name for update;对该表进行锁死操作,但是实际使用中,只是简单的执行语句并达不到锁表的效果,我们需要用到简单的存储过程去实现;

实现思路就是开启一个TRANSACTION(事务)执行我们要锁的表或记录但是不进行COMMIT(提交),那么我们的记录就在事务中,其他窗口进行更新或插入操作将会等待该事务提交再去执行,就达到了我们锁死的效果:

先声明一个简单的存储过程:

DELIMITER $$
DROP PROCEDURE IF EXISTS `lock_table`$$
CREATE PROCEDURE lock_table()
	BEGIN
	START TRANSACTION;
	SELECT * from table_name WHERE id = 68 FOR UPDATE;
	END;

在进行执行以上存储过程即可:

CALL lock_table();

锁死状态通过执行 COMMIT;命令进行释放。

以上存储过程也可对表进行锁死,只需将条件去掉即可,完整的sql如下,请按步骤执行

#1:
DELIMITER $$
DROP PROCEDURE IF EXISTS `lock_table`$$
CREATE PROCEDURE lock_table()
	BEGIN
	START TRANSACTION;
	SELECT * from table_name WHERE id = 68 FOR UPDATE;
	END;
#2:
CALL lock_table();
#3:
COMMIT;

通过设置mysql数据库的自动提交属性,因为MySQL默认使用autocommit模式,也就是说,当你执行一个更新操作后,MySQL会立刻将结果进行提交。注意设置的命令只对当前console控制台生效。

set autocommit = 0;#关闭

set autocommit = 1;#开启
关闭自动提交之后,直接执行for update语句即可完成对表或数据的锁定。



猜你喜欢

转载自blog.csdn.net/fu250/article/details/80395876