一文搞定 Spring事务( 四 )


【MySQL数据库】查看MySQL数据库之中的默认隔离级别
SHOW VARIABLES LIKE 'transaction_isolation';举个栗子,来看看隔离级别的作用吧
修改testInsertIsolation测试类
definition.setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED);// 设置事务隔离级别为:读已提交执行结果:

因为我们线程B在修改后,就提交了 , 而我们设置的隔离级别是读已提交,所以能读到已提交的数据
事务线程-A【查询结果】:Book(bid=1, title=Java入门到入土, author=李老师, price=99.9)事务线程-B 执行结果:1事务线程-A【查询结果】:Book(bid=1, title=Netty, author=李老师, price=99.9)5、Spring事务传播机制
事务开发是和业务层有直接联系的,在进行开发的过程之中,很难出现业务层之间不互相调用的场景,例如:存在有一个A业务处理,但是A业务在处理的时候有可能会调用B业务,那么如果此时A和B之间各自都存在有事务的机制,那么这个时候就需要进行事务有效的传播管理 。

一文搞定 Spring事务

文章插图

一文搞定 Spring事务

文章插图
1、TransactionDefinition.PROPAGATION_REQUIRED:默认事务隔离级别,子业务直接支持当前父级事务 , 如果当前父业务之中没有事务 , 则创建一个新的事务,如果当前父业务之中存在有事务,则合并为一个完整的事务 。简化的理解:不管任何的时候,只要进行了业务的调用,都需要创建出一个新的事务,这种机制是最为常用的事务传播机制的配置 。
2、TransactionDefinition.PROPAGATION_SUPPORTS:如果当前父业务存事务,则加入该父级事务 。如果当前不存在有父级事务,则以非事务方式运行;
3、TransactionDefinition.PROPAGATION_NOT_SUPPORTED:以非事务的方式运行,如果当前存在有父级事务,则先自动挂起父级事务后运行;
4、TransactionDefinition.PROPAGATION_MANDATORY:如果当前存在父级事务,则运行在父级事务之中,如果当前无事务则抛出异常(必须存在有父级事务);
5、TransactionDefinition.PROPAGATION_REQUIRES_NEW:建立一个新的子业务事务,如果存在有父级事务则会自动将其挂起,该操作可以实现子事务的独立提交,不受调用者的事务影响,即便父级事务异常,也可以正常提交;
6、TransactionDefinition.PROPAGATION_NEVER:以非事务的方式运行,如果当前存在有事务则抛出异常;
7、TransactionDefinition.PROPAGATION_NESTED:如果当前存在父级事务,则当前子业务中的事务会自动成为该父级事务中的一个子事务,只有在父级事务提交后才会提交子事务 。如果子事务产生异常则可以交由父级调用进行异常处理,如果父级事务产生异常,则其也会回滚 。

推荐阅读