开始事务
事务是一组连续的 SQL 语句,例如 select,insert,update 或 delete,它们作为一个单独的工作单元执行。
换句话说,除非组内的每个单独操作都成功,否则事务永远不会完成。如果事务中的任何操作失败,则整个事务将失败。
银行事务将是解释这一点的最好例子。考虑两个帐户之间的转移。要实现此目的,你必须编写执行以下操作的 SQL 语句
- 检查第一个帐户中请求金额的可用性
- 扣除第一个帐户的金额
- 存入第二个帐户
如果任何人这些过程失败,整个应该恢复到以前的状态。
ACID:事务的属性
事务具有以下四个标准属性
- 原子性: 确保工作单元内的所有操作都成功完成; 否则,事务在失败时中止,并且先前的操作回滚到其先前的状态。
- 一致性: 确保数据库在成功提交的事务上正确更改状态。
- 隔离: 使事务能够独立运行并相互透明。
- 持久性: 确保在系统出现故障时,已提交事务的结果或效果仍然存在。
事务以语句 START TRANSACTION
或 BEGIN WORK
开头,以 COMMIT
或 ROLLBACK
语句结束。开始和结束语句之间的 SQL 命令构成了事务的大部分。
START TRANSACTION;
SET @transAmt = '500';
SELECT @availableAmt:=ledgerAmt FROM accTable WHERE customerId=1 FOR UPDATE;
UPDATE accTable SET ledgerAmt=ledgerAmt-@transAmt WHERE customerId=1;
UPDATE accTable SET ledgerAmt=ledgerAmt+@transAmt WHERE customerId=2;
COMMIT;
使用 START TRANSACTION
时,自动提交将保持禁用状态,直到你使用 COMMIT
或 ROLLBACK
结束事务。然后,自动提交模式将恢复为先前的状态。
FOR UPDATE
指示(并锁定)事务持续时间的行。
虽然事务仍未提交,但此事务将无法供其他用户使用。
事务涉及的一般程序
- 通过发出 SQL 命令
BEGIN WORK
或START TRANSACTION
开始事务。 - 运行所有 SQL 语句。
- 检查是否所有内容都按照你的要求执行。
- 如果是,则发出
COMMIT
命令,否则发出ROLLBACK
命令将所有内容恢复到之前的状态。 - 如果你正在使用或最终可能使用 Galera / PXC,即使在
COMMIT
之后也要检查错误。