一、事务的概念
事务就是在业务代码发生异常时,用来保护数据库数据完整性的一种技术.
事务是把业务看成可执行的序列,事务保证所有业务序列都正确执行,然后才进行事务提交,事务是一系列的动作,它们综合在一起才是一个完整的工作单元,这些动作必须全部完成,如果发生异常,则执行事务回滚,保证数据库的数据不变.当业务需要对数据库中的一张或者多张表中的多条数据记录产生影响( insert / update / delete )时, 为了保证数据的安全,这时就要考虑事务.
数据库事务是保证在并发情况下能够正确执行的重要支撑,MySQL常见的数据库引擎中支持事务的是InnoDB。事务要保证能够正常的执行,就必须要保持ACID特性。
二、事务的特性(ACID)
① 原子性(atomicity) 原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
事务是一个原子操作, 由一系列动作组成。 组成一个事务的多个数据库操作是一个不可分割的原子单元,只有所有的操作执行成功,整个事务才提交。
事务中的任何一个数据库操作失败,已经执行的任何操作都必须被撤销,让数据库返回初始状态。
② 一致性(consistency) 事务必须使数据库从一个一致性状态变换到另外一个一致性状态。
一旦所有事务动作完成, 事务就被提交。数据和资源就处于一种满足业务规则的一致性状态,即数据不会被破坏。
比如a+b=100,一个事务改变了a比如增加了a的值,那么必须同时改变b,保证在事务结束以后a+b=100依然成立,这就是一致性。
③ 隔离性(isolation) 事务的隔离性是指一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
在并发数据操作时,不同的事务拥有各自的数据空间,它们的操作不会对对方产生干扰。准确地说,并非要求做到完全无干扰。
数据库规定了多种事务隔离级别,不同的隔离级别对应不用的干扰程度。隔离级别越高,数据一致性越好,但并发行越弱。
比如对于A对B进行转账,A没把这个交易完成的时候,B就不知道A要给他转多少钱。
④ 持久性(durability) 持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来的其他操作和数据库故障不应该对其有任何影响。
数据库管理系统一般采用重执行日志来保证原子性、一致性和持久性。
重执行日志记录了数据库变化的每一个动作,数据库在一个事务中执行一部分操作后发生错误退出,数据库即可根据重执行日志撤销已经执行的操作。对于已经提交的事务即使数据库崩溃,在重启数据库时也能根据日志对尚未持久化的数据进行相应的重执行操作。