MySQL安装完成后,默认使用InnoDB存储引擎,它天然支持事务处理。事务是一组SQL操作的逻辑单元,用来保证数据的一致性与完整性。掌握事务操作,是写好数据库程序的基础。

什么是MySQL事务
事务把多条SQL语句打包成一个整体,要么全部执行成功,要么因为某个错误全部撤销。它具备四个特性,通常称为ACID:
- 原子性:事务内的操作不可分割,要么都做,要么都不做。
- 一致性:事务前后,数据整体状态保持合法。
- 隔离性:多个事务并发时,彼此互不干扰。
- 持久性:提交后的修改会永久保存。
MySQL事务基本操作
在MySQL命令行或客户端中,可以使用下面几条语句控制事务:
| 语句 | 作用 |
|---|---|
| START TRANSACTION | 显式开启一个事务 |
| COMMIT | 提交事务,使修改生效 |
| ROLLBACK | 回滚事务,撤销未提交的修改 |
简单示例
假设有一个账户表,我们要从A账户转给B账户100元,必须保证扣钱和加钱同时成功或同时失败:
-- 开启事务 START TRANSACTION; -- 从A账户扣款 UPDATE account SET balance = balance - 100 WHERE name = 'A'; -- 给B账户加款 UPDATE account SET balance = balance + 100 WHERE name = 'B'; -- 确认无误后提交 COMMIT;
如果中间某一步出错,可以执行 ROLLBACK; 来撤销前面的操作。
自动提交与关闭
MySQL默认开启了自动提交(autocommit),每条SQL会立即生效。可以用下面命令临时关闭:
-- 查看自动提交状态 SELECT @@autocommit; -- 关闭自动提交 SET autocommit = 0; -- 手动提交或回滚 COMMIT; ROLLBACK;
使用编程语言操作事务
在代码里也一样,以Python的pymysql为例:
import pymysql
conn = pymysql.connect(host='127.0.0.1', user='root', password='pass', db='test')
try:
with conn.cursor() as cur:
cur.execute("UPDATE account SET balance=balance-100 WHERE name='A'")
cur.execute("UPDATE account SET balance=balance+100 WHERE name='B'")
conn.commit()
except Exception as e:
conn.rollback()
finally:
conn.close()
常见注意点
- 只有InnoDB等支持事务的引擎才能用事务,MyISAM不支持。
- 事务尽量短小,避免长事务占用锁资源。
- DDL语句(如CREATE TABLE)会隐式提交当前事务。
理解并熟练使用MySQL事务处理,可以让你的数据操作更安全可靠。