org.springframework.transaction.jta.JtaTransactionManager:使用一个JTA实现来管理事务 , 在一个事务跨越多个资源时必须使用 , 它将事务管理的职责委托给javax.transaction.UserTransaction和javax.transaction.TransactionManager对象来管理事务 。
PlatformTransactionManager接口源码:
public interface PlatformTransactionManager {//事务管理器通过TransactionDefinition , 获得“事务状态” , 从而管理事务TransactionStatus getTransaction(@Nullable TransactionDefinition var1) throws TransactionException;//根据状态提交void commit(TransactionStatus var1) throws TransactionException;//根据状态回滚void rollback(TransactionStatus var1) throws TransactionException;}
TransactionDefinition定义事务基本属性org.springframework.transaction.TransactionDefinition接口用于定义一个事务 , 它定义了Spring事务管理的五大属性:隔离级别、传播行为、是否只读、事务超时、回滚规则 。
隔离级别什么是事务的隔离级别?我们知道隔离性是事务的四大特性之一 , 表示多个并发事务之间的数据要相互隔离 , 隔离级别就是用于描述并发事务之间隔离程度的大小 。
如果在并发事务之间如果不考虑隔离性 , 会引发一些安全性问题:脏读、不可重复读和幻读等 。
脏读是指一个事务读到了另一个事务的未提交的数据;不可重复读是指一个事务读到了另一个事务已经提交的修改的数据导致多次查询结果不一致;幻读是指一个事务读到了另一个事务已经提交的插入的数据导致多次查询结果不一致 。
在Spring事务管理中 , 定义了如下5种隔离级别:
ISOLATION_DEFAULT:使用数据库默认的隔离级别;ISOLATION_READ_UNCOMMITTED:最低的隔离级别 , 允许读取已改变而没有提交的数据 , 可能会导致脏读、幻读或不可重复读;ISOLATION_READ_COMMITTED:允许读取事务已经提交的数据 , 可以阻止脏读 , 但是幻读或不可重复读仍有可能发生;ISOLATION_REPEATABLE_READ:对同一字段的多次读取结果都是一致的 , 除非数据事务本身改变 , 可以阻止脏读和不可重复读 , 但幻读仍有可能发生;ISOLATION_SERIALIZABLE:最高的隔离级别 , 完全服从ACID的隔离级别 , 确保不发生脏读、不可重复读以及幻读 , 也是最慢的事务隔离级别 , 因为它通常是通过完全锁定事务相关的数据库表来实现的 。
传播行为Spring事务传播机制规定了事务方法和事务方法发生嵌套调用时事务如何进行传播 , 即协调已经有事务标识的方法之间的发生调用时的事务上下文的规则 。Spring定义了七种传播行为 , 这里以方法A和方法B发生嵌套调用时如何传播事务为例说明:
PROPAGATION_REQUIRED:A如果有事务 , B将使用该事务;如果A没有事务 , B将创建一个新的事务;PROPAGATION_SUPPORTS:A如果有事务 , B将使用该事务;如果A没有事务 , B将以非事务执行;PROPAGATION_MANDATORY:A如果有事务 , B将使用该事务;如果A没有事务 , B将抛异常;PROPAGATION_REQUIRES_NEW:A如果有事务 , 将A的事务挂起 , B创建一个新的事务;如果A没有事务 , B创建一个新的事务;PROPAGATION_NOT_SUPPORTED:A如果有事务 , 将A的事务挂起 , B将以非事务执行;如果A没有事务 , B将以非事务执行;PROPAGATION_NEVER:A如果有事务 , B将抛异常;A如果没有事务 , B将以非事务执行;PROPAGATION_NESTED:A和B底层采用保存点机制 , 形成嵌套事务 。
总结起来就是这张图:
文章插图
是否只读如果将事务设置为只读 , 表示这个事务只读取数据但不更新数据, 这样可以帮助数据库引擎优化事务 。
注意事务的是否“只读”属性 , 不同的数据库厂商支持不同 , 需要结合数据库厂商的具体说明 , 如Oracle的"readOnly"不起作用 , 不影响其增删改查;MySQL的"readOnly"为true时 , 只能查 , 增删改都会抛出异常 。
事务超时事务超时就是事务的一个定时器 , 在特定时间内事务如果没有执行完毕 , 那么就会自动回滚 , 而不是一直等待其结束 。在TransactionDefinition中以int的值来表示超时时间 , 默认值是-1(单位是秒) 。
推荐阅读
- 心理委员的职责是什么?
- Spring容器6种注入方式
- 通过深度系统学习Linux用户和组
- 如何正确控制springboot中bean的加载顺序总结
- Spring Boot 2.x基础教程:EhCache缓存的使用
- 黑客全家桶、文字提取利器、深度学习 500 问 | GitHub 热点速览
- 基于机器学习的自适应码率算法的进一步探索与改进
- 军事智能化之机器学习《清明上河图》里几个人几个牲口一览无余
- SpringBoot下使用定时任务的方式全揭秘
- 学习美甲以及美甲注意事项