在以上文章的基础上,本文将学习Spring对事务的支持——Spring的事务管理机制。
Spring对事务管理的支持
与E类似,Spring提供了对编码和声明式事务管理的支持。然而,Spring的事务管理能力远远超过E。这里不详细介绍编码事务和声明事务的区别。有兴趣的读者可以自己谷歌一下。
Spring通过事务管理器实现事务管理。Spring提供了许多内置的事务管理器实现:
事务管理器
(org.springframework.*)
使用场景
数据源事务管理器
数据源事务管理器,为单个jax.sql.DataSource提供事务管理,用于Spring JDBC抽象框架、iBATIS或MyBatis框架事务管理;
JdoTransactionManager
为单个jax . jdo . persistencemanagerfactory提供事务管理,用于集成jdo框架时的事务管理;
JpaTransactionManager
提供对单个jax . persistence . entitymanager factory事务的支持,用于集成JPA实现框架时的事务管理;
HibernateTransactionManager
为单个组织提供支持。Hibernate . session factory transaction,用于集成hibernate框架时的事务管理;事务管理器只支持Hibernate3+,Spring3.0+只支持Hibernate 3.2+。
JtaTransactionManager
提供分布式事务管理支持,将事务管理委托给Ja EE应用服务器的事务管理器;
OC4JjtaTransactionManager
Spring提供给OC4J10.1.3+应用服务器的事务管理器的适配器,用于支持应用服务器提供的高级事务;
websphereueowtransactionmanager
Spring提供给WebSphere 6.0+应用服务器的事务管理器的适配器,用于支持应用服务器提供的高级事务;
WebLogicJtaTransactionManager
Spring提供给WebLogic 8.1+应用服务器的事务管理器的适配器,用于支持应用服务器提供的高级事务。
以上是Spring支持的事务管理器。一般常用的是HibernateTransactionManager和DataSourceTransactionManager。当我们使用一个事务时,我们应该声明使用哪个事务管理器。比如:
& ltbean id = & # 34transactionManager & # 34class = & # 34org . spring framework . JDBC . data source . data source transactionmanager & # 34;& gt& lt属性名= & # 34;数据源& # 34;ref = & # 34数据源& # 34;/& gt;& lt/bean & gt;在事务属性spring中,声明性事务由事务属性定义。事务属性描述了事务策略如何应用于方法。交易属性包括五个方面:
交流行为
隔离级别
回滚规则
交易超时
只读?
下面简单介绍一下这五个属性。
传播行为
传播行为定义了客户端和被调用方法之间的事务边界,也就是说,传播规则回答了是否应该启动或暂停新事务,或者该方法是否应该在事务环境中运行的问题。(后面会有关于这个属性的单独文章。)
隔离级别
隔离级别定义了一个事务受其他并发事务影响的程度。多个事务的并发可能导致脏读、幻影读、不可重复读等各种读现象。(具体参考:数据库中的阅读现象分析)
ISOLATION_DEFAULT:使用后端数据库的默认规则。
ISOLATION_READ_UNCOMMITTED:允许读取未提交的数据更改,这可能会导致脏读取、幻影读取或不可重复读取。
ISOLATION_READ_COMMITTED:允许读取并发事务已经提交的数据,这样可以防止脏读,但是仍然可能出现幻影读或者不可重复读。
ISOLATION_REPEATABLE_READ:多次读取同意字段的结果是一致的,除非数据被事务本身修改,以防止脏读和不可重复读取,但仍然可能出现幻影读取。
ISOLATIOM _ SERIALIZABLE:完全服从ACID的隔离级别,确保防止脏读、不可重复读和幻影读,这是最慢的数据隔离级别。
(具体参考,深入分析事务的隔离级别)
是否只读
如果事务只读取后端数据库,数据库可以利用事务ID的只读特性进行一些特定的优化。通过将事务设为只读,您可以让数据库有机会应用它认为合适的优化措施。因为启动事务时数据库是否实现只读,只对那些具有可能启动新事务的传播行为(propagation _ required、propagation _ required _ new、propagation _ nested)的方法有意义。
事务超时
为了使应用程序运行良好,事务不能运行太长时间。因为超时时钟将在事务开始时开始,所以它仅对那些具有可能启动新事务的传播行为(propagation _ required、propagation _ required _ new、propagation _ nested)的方法有意义。
事务回滚
事务回滚规则定义了哪些异常会导致事务回滚,哪些不会。默认情况下,事务只有在遇到运行时异常时才会回滚,而不会在遇到检查异常时回滚。
配置方式
交易属性的配置方式由以下关键字指定:
关键字
意义
隔离
指定事务的隔离级别。
传播
定义事务的传播规则
只读
指定事务是只读的。
roll back-for
no-roll back-for
Rollback-for指定事务应在不提交的情况下回滚哪些检查异常
no-rollback-for指定事务应在不回滚的情况下继续执行哪些异常。
超时
为长时间运行的事务定义超时。
XML中的事务属性配置如下:
& lttx:建议id = & # 34txAdvice & # 34transactionmanager = & # 34transactionManager & # 34& gt& lttx:attributes & gt;& lttx:方法名= & # 34;*"传播= & # 34;必填& # 34;只读= & # 34;真& # 34;/& gt;& lt/tx:属性& gt& lt/tx:advice & gt;注释中的事务属性配置如下:
@ transaction(propagation = propagation。必选,readonly = true) public void add(字符串用户名){//…}汇总事务是企业应用开发的重要组成部分,使软件更加健壮。他保证孤注一掷的行动。
Spring支持编码的和声明的事务管理。无论使用哪种方法进行事务管理,都应该知道与事务相关的五个属性。
“做程序员,圈子和学习最重要”因为有了圈子,你可以少走弯路,拓宽人脉,拓展思路,学习别人的经验和学习方法!同时也想免费分享一下已经编译好的高级Ja后端笔记和学习资料!如果你需要信息,我会从你的私信(06)中扣除
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。