START TRANSACTION:开始事务,autocommit 设为 0,如果已经有一个事务在运行,则
会触发一个隐藏的 COMMIT
COMMIT:提交事务,保存更改,释放锁
ROLLBACK:回滚本事务对数据库的所有更改,然后结束事务,释放锁
SAVEPOINT savepoint_name:创建一个 savepoint 识别符来 ROLLBACK TO SAVEPOINT
ROLLBACK TO SAVEPOINT savepoint_name:回滚到从 savepoint_name 开始对数据库的所
有更改,这样就允许回滚事务中的一部分,保证更改的一个子集被提交
SET TRANSACTION:允许设置事务的隔离级别
LOCK TABLES:允许显式的锁住一个或多个 table,会隐式的关闭当前打开的事务,建议
在执行 LOCK TABLES 语句之前显式的 commit 或 rollback。我们一般所以一般在事务代码
里不会使用 LOCK TABLES
2,定义事务
MySQL 默认的行为是在每条 SQL 语句执行后执行一个 COMMIT 语句,从而有效的将每条
语句独立为一个事务。
在复杂的应用场景下这种方式就不能满足需求了。
为了打开事务,允许在 COMMIT 和 ROLLBACK 之前多条语句被执行,我们需要做以下两
步:
1, 设置 MySQL 的 autocommit 属性为 0,默认为 1
2,使用 START TRANSACTION 语句显式的打开一个事务
如果已经打开一个事务,则 SET autocommit=0 不会起作用,因为 START TRANSACTION
会隐式的提交 session 中所有当前的更改,结束已有的事务,并打开一个新的事务。
使用 SET AUTOCOMMIT 语句的存储过程例子:
Java 代码 复制代码
1. CREATE PROCEDURE tfer_funds
2. (from_account int, to_account int, tfer_amount numeric(10,2))
3. BEGIN
4. SET autocommit=0;
5.
6. UPDATE account_balance SET balance=balance-tfer_amount WHERE
account_id=from_account;
7.
8. UPDATE account_balance SET balance=balance+tfer_amount WHERE
account_id=to_account;
9.
10. COMMIT;
11. END;