在MySQL中,事务回滚(Rollback)是将事务中所有已执行的操作撤销,使数据库恢复到事务开始前的状态。这是事务ACID特性中"原子性"的重要体现。
显式事务中出现错误
sql
BEGIN;
INSERT INTO accounts VALUES (1, 100);
-- 假设这里发生错误
ROLLBACK; -- 必须执行以撤销前面的操作
死锁发生时
违反约束条件时
连接异常中断时
InnoDB引擎检测到内部错误时
事务成功执行时
sql
BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
COMMIT; -- 无需ROLLBACK
自动提交模式下
使用SAVEPOINT部分回滚时
sql
BEGIN;
INSERT INTO table1 VALUES (1);
SAVEPOINT sp1;
INSERT INTO table1 VALUES (2);
ROLLBACK TO sp1; -- 只回滚到sp1,不是完整ROLLBACK
COMMIT;
显式处理事务:总是使用BEGIN/START TRANSACTION明确事务开始
错误处理:在应用程序中捕获异常并决定是否ROLLBACK
避免长事务:长时间未提交的事务会锁定资源
合理设置隔离级别:根据业务需求选择合适的隔离级别
监控死锁:分析并优化频繁导致死锁的业务逻辑
理解何时必须回滚、何时可以省略,是保证数据一致性和系统性能的关键。