开始事务

事务是一组连续的 SQL 语句,例如 select,insert,update 或 delete,它们作为一个单独的工作单元执行。

换句话说,除非组内的每个单独操作都成功,否则事务永远不会完成。如果事务中的任何操作失败,则整个事务将失败。

银行事务将是解释这一点的最好例子。考虑两个帐户之间的转移。要实现此目的,你必须编写执行以下操作的 SQL 语句

  1. 检查第一个帐户中请求金额的可用性
  2. 扣除第一个帐户的金额
  3. 存入第二个帐户

如果任何人这些过程失败,整个应该恢复到以前的状态。

ACID:事务的属性

事务具有以下四个标准属性

  • 原子性: 确保工作单元内的所有操作都成功完成; 否则,事务在失败时中止,并且先前的操作回滚到其先前的状态。
  • 一致性: 确保数据库在成功提交的事务上正确更改状态。
  • 隔离: 使事务能够独立运行并相互透明。
  • 持久性: 确保在系统出现故障时,已提交事务的结果或效果仍然存在。

事务以语句 START TRANSACTIONBEGIN WORK 开头,以 COMMITROLLBACK 语句结束。开始和结束语句之间的 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 时,自动提交将保持禁用状态,直到你使用 COMMITROLLBACK 结束事务。然后,自动提交模式将恢复为先前的状态。

FOR UPDATE 指示(并锁定)事务持续时间的行。

虽然事务仍未提交,但此事务将无法供其他用户使用。

事务涉及的一般程序

  • 通过发出 SQL 命令 BEGIN WORKSTART TRANSACTION 开始事务。
  • 运行所有 SQL 语句。
  • 检查是否所有内容都按照你的要求执行。
  • 如果是,则发出 COMMIT 命令,否则发出 ROLLBACK 命令将所有内容恢复到之前的状态。
  • 如果你正在使用或最终可能使用 Galera / PXC,即使在 COMMIT 之后也要检查错误。