在MySQL中,事务是一个数据库操作的最小执行单元,它由一个或多个SQL语句组成,这些SQL语句要么全部执行成功,要么全部失败回滚。所以,事务是一种机制,用来保证一系列操作要么全部执行成功,要么全部失败回滚,从而保持数据库的一致性和完整性。MySQL中只有使用支持事务的存储引擎(如InnoDB)才能使用事务功能。
如果数据库中没有事务机制,那会怎么样呢?★超级典型的金融案例,案例改编自《高性能MySQL》第四版:假设银行对两个用户账号进行转账:操作用户账户表(包括转账源头和转账目标)。现在要从用户A的账户转账元到用户B的账户中,那么需要至少三个步骤:
检查账户A的余额高于元。
从账户A余额中减去元。
在账户B的余额中增加元。
上述三个步骤的操作必须打包在一个事务中,任何一个步骤失败,则必须回滚所有的步骤。
可以用STARTTRANSACTION语句开始一个事务,然后要么使用COMMIT提交事务将修改的数据持久保留,要么使用ROLLBACK撤销所有的修改。事务SQL的样本如下:
/*开始事务*/STARTTRANSACTION;/*检查账户A()的余额高于元*/SELECTbalanceFROMacountWHEREcustomer_id=;/*从账户A()余额中减去元*/UPDATEacountSETbalance=balance-.00WHEREcustomer_id=;/*在账户B()余额中增加元*/UPDATEacountSETbalance=balance+.00WHEREcustomer_id=;/*提交事务*/COMMIT;
解读下这个SQL脚本:
如果执行到第四条语句时服务器崩溃了,用户A可能会损失元,而用户B也没有接收到元。
如果执行到第三条语句和第四条语句之间时,另外一个进程要消费掉A账户的所有余额,那么结果可能就是银行在不知道这个逻辑的情况下白白给了B账户元。
所以,金融类系统需要有严格的ACID测试,ACID是指原子性(atomicity)、一致性(consistency)、隔离性(isolation)和持久性durability)。一个运行良好的事务处理系统,必须具备这些标准特征。
2事务的四个特性(ACID)一般来说,衡量事务必须满足四个特性:ACID,即原子性(Atomicity,或称不可分割性)、一致性(Consistency)、隔离性(Isolation,又称独立性)、持久性(Durability)。
原子性(Atomicity):一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
一致性(Consistency):在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。
隔离性(Isolation):数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(readun