mysql的锁行锁表锁

烟碎雨落花甽醉 6个月前 158浏览 0评论

MySQL是一款强大的关系型数据库管理系统,它支持多种方式的并发操作。在高并发环境下,如何控制数据库操作的并发性成为了一个重要的问题,MySQL提供了三种锁来解决这个问题:锁行,锁表和排它锁。

锁行是指在数据表中某个行被一个事务占用后,其他的事务不能对该行执行任何修改、删除或插入操作,只能对该行执行读取操作,直到持有锁的事务释放该行的锁。锁行一般用于更新或删除操作,可以保证数据的一致性。

-- 示例代码:锁定一行数据
SELECT * FROM `user` WHERE `id` = 1 FOR UPDATE;

锁表是指在数据表中整个表被一个事务占用后,其他的事务不能对该表执行任何修改、删除或插入操作,只能对该表执行读取操作,直到持有锁的事务释放该表的锁。锁表一般用于执行一些高负载的查询操作,可以减少锁冲突的可能性。

-- 示例代码:锁定整个表
LOCK TABLES `user` WRITE;

排它锁是指在数据表中某个行被一个事务占用后,其他的事务不能对该行执行任何操作,包括读取操作,直到持有锁的事务释放该行的锁。排它锁一般用于在事务中执行一些敏感的操作,如数据的插入、更新和删除操作。

-- 示例代码:插入一行数据并加排它锁
START TRANSACTION;
INSERT INTO `user` (`name`, `age`, `tel`) VALUES ('Lucy', 24, '18700000000');
SELECT * FROM `user` WHERE `id` = LAST_INSERT_ID() FOR UPDATE;
COMMIT;

在使用锁的时候,需要注意避免死锁的情况。当多个事务相互等待对方释放锁的时候,就会发生死锁。MySQL能够检测到死锁,并自动选择一个事务作为牺牲品,回滚牺牲事务所做的更改,以避免死锁。