什么是数据库事务?如果没有事物会有什么后果?事务的特性是什么?
事务是指作为单个逻辑工作单元执行的一系列操作,可以被看作一个单元的一系列SQL语句的集合。要么完全地执行,要么完全地不执行。
如果不对数据库进行并发控制,可能会产生 脏读、非重复读、幻像读、丢失修改的异常情况。
事务的特性(ACID)
A, atomacity 原子性 事务必须是原子工作单元;对于其数据修改,要么全都执行,要么全都不执行。通常,与某个事务关联的操作具有共同的目标,并且是相互依赖的。如果系统只执行这些操作的一个子集,则可能会破坏事务的总体目标。原子性消除了系统处理操作子集的可能性。
C, consistency 一致性
事务将数据库从一种一致状态转变为下一种一致状态。也就是说,事务在完成时,必须使所有的数据都保持一致状态(各种 constraint 不被破坏)。
I, isolation 隔离性 由并发事务所作的修改必须与任何其它并发事务所作的修改隔离。事务查看数据时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看中间状态的数据。换句话说,一个事务的影响在该事务提交前对其他事务都不可见。
D, durability 持久性
事务完成之后,它对于系统的影响是永久性的。该修改即使出现致命的系统故障也将一直保持。
“A向B汇钱100”
读出A账号余额(500)。 A账号扣钱操作(500-100)。 结果写回A账号(400)。 读出B账号余额(500)。 B账号做加法操作(500+100)。 结果写回B账号(600)。 原子性:
保证1-6所有过程要么都执行,要么都不执行。如果异常了那么回滚。
一致性
转账前,A和B的账户中共有500+500=1000元钱。转账后,A和B的账户中共有400+600=1000元。
隔离性
在A向B转账的整个过程中,只要事务还没有提交(commit),查询A账户和B账户的时候,两个账户里面的钱的数量都不会有变化。
持久性
一旦转账成功(事务提交),两个账户的里面的钱就会真的发生变化