ACID:
原子性(Atomicity):整个数据库事务是不可分割的工作单位,事务中所有操作都成功,整个事务才算成功
一致性(Consistency):从一种一致状态到下一种一致状态
隔离性(Isolation):事务提交前对其他事务都不可见
持久性(Durability):事务只要提交,就是永久性的
事务的分类(类似于事务的传播属性):
扁平事务(Flat Transactions)
带有保存点的扁平事务(Flat Transactionswith Savepoints)
链事务(Chains Transactions)
嵌套事务(Nested Transactions)
分布式事务(Distributed Transactions)
扁平事务:
所有操作都是同一层次,要么都执行,要么都回滚,@Transactional注解中默认的传播属性:
propagation = Propagation.REQUIRED----支持当前事务,若没有当前事务,则新建一个
带有保存点的扁平事务:
允许事务在执行过程中回滚到同一个事务中较早的状态,即事务是回滚到指定的状态,不是整个回滚。保存点(Savepoint)用来通知系统应该记住事务当前的状态。且是递增的。扁平事务其实也隐式的含有一个保存点,所以回滚就全部回滚,提交就全部提交。
java中手动处理事务时,好像是可以做到这种方式,目前没有找到@Transactional注解可以处理这种事务
链事务:
上一个事务的提交和下个事务的操作合并成一个原子,即可以理解为将多个事务合并成一个事务,所以也就只能回滚到最近的一个保存点(和带保存点的扁平事务的区别)
@Transactional注解中propagation = Propagation.REQUIRES_NEW 新建事务,如果当前存在事务,把当前事务挂起
如上图所视,serviceC中的addC()会回滚,但是addA()和addB()均将数据插入数据库
虽然是同样的效果,但是和链事务还是不同,链事务是将上一个事务提交了触发第二个事务的开始,而此注解是挂起当前,新建一个,所以只是回滚新建的事务
嵌套事务(Nested Transaction):
由一个顶层事务控制着各个层次的事务。顶层事务下的都叫子事务
任何子事务都是在顶层事务提交后才会真正的提交
树中任意一个事务的回滚会引起它的所哟子事务一起回滚,所哟子事务不具有持久性D