事务和锁是 MySQL 中保证数据正确性与并发安全的核心机制。查询数据更多关注“如何把数据取出来”,而事务与锁关注的是“多个人同时操作数据时,如何保证结果仍然正确”。
事务(Transaction)是一组不可再分的 SQL 操作,这组操作要么全部执行成功,要么全部执行失败,不会只完成一部分。
典型场景是转账:
这两个步骤必须作为一个整体执行。如果只扣款成功、加款失败,数据就会出现错误,因此需要事务保证一致性。
事务通常用 ACID 来描述:
MySQL 中常见的事务控制语句如下:
START TRANSACTION;
UPDATE account SET balance = balance - 100 WHERE id = 1;
UPDATE account SET balance = balance + 100 WHERE id = 2;
COMMIT;
如果执行过程中发现异常,可以回滚:
START TRANSACTION;
UPDATE account SET balance = balance - 100 WHERE id = 1;
UPDATE account SET balance = balance + 100 WHERE id = 2;
ROLLBACK;
其中:
START TRANSACTION 表示开启事务COMMIT 表示提交事务ROLLBACK 表示回滚事务锁(Lock)是数据库在并发场景下保护数据的一种机制。当多个会话同时读写同一批数据时,MySQL 通过加锁来避免脏数据、覆盖更新和不一致问题。
可以把锁理解为“先占用资源,再进行操作”的规则。谁先拿到锁,谁就先操作;其他事务需要等待或按隔离规则读取。
InnoDB 一般以行锁为主,因此更适合高并发业务场景。
如果没有锁,在并发环境下容易出现以下问题:
MySQL 常见事务隔离级别包括:
隔离级别越高,数据越安全,但并发性能通常越低,因此实际使用时要在一致性与性能之间平衡。
可以用下面的语句查看当前会话的隔离级别:
SELECT @@transaction_isolation;
也可以设置当前会话的隔离级别:
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
事务解决的是“操作要不要作为一个整体成功”的问题,锁解决的是“并发操作时谁可以先访问数据”的问题。掌握这两个基础概念后,再学习 MySQL 的更新、删除、索引优化和性能调优会更容易建立完整认识。