2026-01-23 17:13:43
在 MySQL 中,使用事务可确保多条 SQL 操作的原子性,即所有操作要么全部成功,要么全部不生效,从而保证数据一致性。以下是具体实现方法及关键注意事项:
一、基础事务操作MySQL 默认启用自动提交(autocommit=1),需显式关闭以手动控制事务流程:
示例:银行转账场景
START TRANSACTION;UPDATE accounts SET balance = balance - 100 WHERE user_id = 1; -- 扣款UPDATE accounts SET balance = balance + 100 WHERE user_id = 2; -- 存款-- 若两条语句均成功,执行:COMMIT;-- 若任一失败,执行:ROLLBACK;二、设置保存点(部分回滚)复杂事务中可通过 SAVEPOINT 实现部分回滚,避免全部撤销:
示例:日志插入分步控制
START TRANSACTION;INSERT INTO logs (msg) VALUES ('step1');SAVEPOINT sp1; -- 创建保存点INSERT INTO logs (msg) VALUES ('step2');-- 若出错,仅回滚到 sp1,保留 step1ROLLBACK TO sp1;COMMIT; -- 最终提交三、事务隔离级别与锁机制事务的隔离级别影响并发行为,需根据场景选择:
READ UNCOMMITTED:最低隔离,可能读到未提交数据(脏读)。
READ COMMITTED:避免脏读,但可能不可重复读。
REPEATABLE READ(MySQL 默认):避免脏读和不可重复读,但可能幻读。
SERIALIZABLE:最高隔离,完全串行化,性能最低。
并发问题注意事项
实际开发中通常通过代码管理事务,以 Python + PyMySQL 为例:
import pymysqlconnection = pymysql.connect(host='localhost', user='user', password='pass', database='db')try: connection.begin() # 开启事务 cursor = connection.cursor() cursor.execute("UPDATE a SET val=val-10 WHERE id=1") cursor.execute("UPDATE b SET val=val+10 WHERE id=1") connection.commit() # 提交except Exception as e: connection.rollback() # 异常时回滚 print(f"事务失败,已回滚: {e}")finally: connection.close()关键点
通过以上方法,可有效利用 MySQL 事务保障多条 SQL 操作的一致性,适用于转账、订单处理等高可靠性场景。