jax.persistence

在以上文章的基础上,本文将学习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+应用服务器的事务管理器的适配器,用于支持应用服务器提供的高级事务。

javax.persistence

以上是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)中扣除

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。

发表回复

登录后才能评论