概念:当一个事务方法被另一个事务方法调用时,这个事务方法应该如何进行
例:批量转账,给10个人,最后一个人转账出了问题,是全部回滚还是只回滚最后一个人的
代码演示
public void A(){
sout("A方法执行了");
B();
}
public void B(){
sout("B方法执行了");
}
必须有事务
- required如果当前没有事物就创建一个事物,如果当前有事物就加入该事物
A调用B,AB共用一个事务 - mandatory支持当前事物,如果当前存在事物就加入该事物,否则就抛出异常
A调用B,A必须有事务,否则报异常 - requires-new 无论当前有没有事物,都重新创建一个新事物
A调用B,运行到B时,将A的事务挂起,B自己的事务运行后,A事务继续,B事务不影响A事务 - nested 如果当前存在事物,则在嵌套事物内执行,如果当前没有事物,就创建一个新事物
A调用B,B事务会影响A事务
可有可无的
- supports 支持当前事物,如果当前存在事物就加入该事物,否则就以非事物的方式执行
A调用B,如果A没有事务,就无事务运行,A有事务,就加入A的事务
死活不能有事务
- not-supported 如果当前有事物就挂起是否,否则以非实物的方式执行
A调用B,A有事务,执行到B的时候会将此事务挂起,B执行后,此事务继续 - never 如果当前存在事物 就抛出异常,否则就以非事物的方式执行
A调用B,如果A没有事务,就正常运行,A有事务,就会抛出异常
隔离级别
• Read uncommitted(读未提交) ------会导致脏读
• Read Committed(读已提交) ------会导致不可重复读
• Repeatable Reads(可重复读)默认------在开始读取数据(事务开启)时,不再允许修改数据,如果添加数据,则不可避免,会导致幻读
• Serializable(串行化)------将整张表锁起来