假如你下了一笔订单,会有如下数据库操做:数据库
1. 生成一笔订单记录 2. 减小库存 3. 从你的帐户中减小金额 4. 生成支付记录
这边的四个操做缺一不可,一旦某一个操做出现异常,则所有操做都须要所有回滚。而事务的做用就是保证在出现异常的状况下可以对操做进行回滚。并发
原子性是指事务包含的全部操做要么所有成功,要么所有失败回滚。所以事务的操做若是成功就必需要彻底应用到数据库,若是操做失败则不能对数据库有任何影响。分布式
一致性是指事务必须使数据库从一个一致性状态变换到另外一个一致性状态,也就是说一个事务执行以前和执行以后都必须处于一致性状态。
拿转帐来讲,假设用户A和用户B二者的钱加起来一共是5000,那么无论A和B之间如何转帐,转几回帐,事务结束后两个用户的钱相加起来应该还得是5000,这就是事务的一致性。code
隔离性是当多个用户并发访问数据库时,好比操做同一张表时,数据库为每个用户开启的事务,不能被其余事务的操做所干扰,多个并发事务之间要相互隔离。
即要达到这么一种效果:对于任意两个并发的事务T1和T2,在事务T1看来,T2要么在T1开始以前就已经结束,要么在T1结束以后才开始,这样每一个事务都感受不到有其余事务在并发地执行。事务
持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即使是在数据库系统遇到故障的状况下也不会丢失提交事务的操做。ci
脏读是指在一个事务读取了另外一个未提交的事务中的数据。
如:事务B
对商品C
的库存进行了修改,可是该事务还未提交。这时候事务A
读取了商品C
的库存,后来发现代码有问题,对事务B
进行了回滚,那么事务A
读取的就是脏数据了。
通常都是事务的隔离级别保证的就是这个,隔离级别越高效率越低。it
不可重复读是指事务A
在查询过程当中,事务B
修改了数据。第一次和第二次的结果不一样。
但这是能够接受的。io
幻读指的是事务A
在读取过程,事务B
对添加了一些数据,致使读取的结果长度有了变化。效率
假设上述的操做,在四个节点进行操做,普通的事务回滚将不会有效。由于不知道全部的操做是否都成功了。方法