)
第 45.1 节:开始事务事务是一组顺序执行的 SQL 语句(如SELECT、INSERT、UPDATE或DELETE),作为一个单独的工作单元执行。换句话说,只有当组内的每个操作都成功时,事务才算完成。如果事务中的任何操作失败,整个事务将失败。银行转账是解释此概念的最佳示例。假设要在两个账户之间转账。你需要编写如下 SQL 语句:检查第一个账户中是否有请求的金额从第一个账户扣除请求的金额将金额存入第二个账户如果这些过程中的任何一个失败,整个过程应回滚到之前的状态。事务的 ACID 属性事务具有以下四个标准属性:原子性(Atomicity):确保工作单元内的所有操作都成功完成;否则,事务在失败点中止,之前的操作回滚到之前的状态。一致性(Consistency):确保数据库在成功提交的事务后正确更改状态。隔离性(Isolation):使事务能够独立且透明地操作。持久性(Durability):确保已提交事务的结果在系统故障后仍然存在。事务以START TRANSACTION或BEGIN WORK语句开始,以COMMIT或ROLLBACK语句结束。开始和结束语句之间的 SQL 命令构成事务的主体。STARTTRANSACTION;SET@transAmt='500';SELECT@availableAmt:=ledgerAmtFROMaccTableWHEREcustomerId=1FORUPDATE;UPDATEaccTableSETledgerAmt=ledgerAmt-@transAmtWHEREcustomerId=1;UPDATEaccTableSETledgerAmt=ledgerAmt+@transAmtWHEREcustomerId=2;COMMIT;使用START TRANSACTION时,autocommit保持禁用状态,直到你使用COMMIT或ROLLBACK结束事务。然后autocommit模式恢复为之前的状态。FOR UPDATE表示(并锁定)事务期间的行。当事务保持未提交状态时,其他用户无法看到此事务的更改。事务的一般流程通过BEGIN WORK或START TRANSACTION开始事务。运行所有 SQL 语句。检查所有语句是否按需求执行。如果是,则发出COMMIT命令;否则发出ROLLBACK命令将一切恢复到之前的状态。注意:即使在使用(或可能最终使用)Galera/PXC 时,也应在COMMIT后检查错误。第 45.2 节:COMMIT、ROLLBACK 和 AUTOCOMMITAUTOCOMMITMySQL 会自动提交不属于事务的语句。任何未以BEGIN或START TRANSACTION开头的UPDATE、DELETE或INSERT语句的结果将立即对所有连接可见。AUTOCOMMIT变量默认设置为true。可以通过以下方式更改:-- 设置 autocommit 为 falseSETAUTOCOMMIT=false;-- 或SETAUTOCOMMIT=0;-- 设置 autocommit 为 trueSETAUTOCOMMIT=true;-- 或SETAUTOCOMMIT=1;-- 查看 AUTOCOMMIT 状态SELECT@@autocommit;COMMIT如果AUTOCOMMIT设置为false且事务未提交,则更改仅对当前连接可见。执行COMMIT语句后,更改将提交到表中,结果对所有连接可见。考虑两个连接来说明这一点:连接 1-- 在设置 autocommit=false 之前向新表添加一行mysqlINSERTINTOtestTableVALUES(1);-- 设置 autocommit = falsemysqlSETautocommit=0;mysqlINSERTINTOtestTableVALUES(2),(3);mysqlSELECT*FROMtestTable;+-----+|tId|+-----+|1||