Spring中的事务管理详解

  • 时间:
  • 浏览:2

① 原子性(atomicity):事务是有一另两个 原子操作,有一系列动作组成。事务的原子性确保动作要么完整完成,要么完整不起作用

② 一致性(consistency):一旦所有事务动作完成,事务就被提交。数据和资源就地处有有一种满足业务规则的一致性清况 中

③ 隔离性(isolation):可能有或多或少事务会一起去避免相同的数据,我应该 每个事物都应该与或多或少事务隔拖累来,避免数据损坏

④ 持久性(durability):一旦事务完成,无论地处哪些地方系统错误,它的结果不会应该受到影响。通常清况 下,事务的结果被写到持久化存储器中

本文来自云栖社区相互商务合作伙伴“Java杂记”,了解相关信息可能够够关注“Java杂记”。

作为企业级应用守护应用应用程序框架,Spring在不同的事务管理API之上定义了有一另两个 抽象层。而应用守护应用应用程序开发人员无须了解底层的事务管理API,就可能够够使用Spring的事务管理机制。

http://www.cnblogs.com/longshiyVip/p/40061547.html

在幕后HibernateTransactionManager将事务管理的职责委托给org.hibernate.Transaction对象,而后者是从Hibernate Session中获取到的。当事务成功完成时,HibernateTransactionManager可能调用Transaction对象的commit()最好的依据来提交事务。同样,事务失败时通过调用Transaction的rollback()最好的依据进行回滚。

Spring事务的隔离级别

http://www.springframework.org/schema/beans

Spring对全局事务的支持:

…… <property name="jpaDialect" ref="jpaDialect"/></bean><bean id="jpaDialect" class="org.springframework.orm.jpa.vendor.HibernateJpaDialect"/>

图9-1 Spring事务管理器

Spring提供了或多或少内置事务管理器实现:

声明式事务管理:大多数清况 下比编程式事务管理更好用。它将事务管理代码从业务最好的依据中分离出来,以声明的最好的依据来实现事务管理。事务管理作为有有一种横切关注点,可能够够通过AOP最好的依据模块化。Spring通过Spring AOP框架支持声明式事务管理。

当事务最好的依据被以前事务最好的依据调用时,时需指定事务应该怎么传播。类式:最好的依据可能继续在现有事务中运行,也可能开启有一另两个 新事务,并在当事人的事务中运行。

在Spring中,声明式事务是通过事务属性来定义的,事务属性描述了事务策略怎么应用到最好的依据上。事务属性含有了八个方面,尽管Spring提供了多种声明式事务的机制,我应该 所有的最好的依据都依赖这八个参数来控制怎么管理事务策略。声明式事务通过传播行为,隔离级别,只读提示,事务超时及回滚规则来进行定义。

为了使应用守护应用应用程序更好的运行,事务如此 运行太长的时间。我应该 ,声明式事务的第八个形状若果超时。

Spring事务的回滚规则

4. Spring的事务管理器

Spring事务的隔离级别

1. ISOLATION_DEFAULT: 这是有一另两个 PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别.

另外八个与JDBC的隔离级别相对应

2. ISOLATION_READ_UNCOMMITTED: 这是事务最低的隔离级别,它充许令外有一另两个 事务可能够够看一遍你你这人事务未提交的数据。

你你这人隔离级别会产生脏读,不可重复读和幻像读。

3. ISOLATION_READ_COMMITTED: 保证有一另两个 事务修改的数据提交不会 够被另外有一另两个 事务读取。另外有一另两个 事务如此 读取该事务未提交的数据

4. ISOLATION_REPEATABLE_READ: 你你这人事务隔离级别可能够够避免脏读,不可重复读。我应该 可能老要出现幻像读。

它除了保证有一另两个 事务如此 读取以前事务未提交的数据外,还保证了避免下面的清况 产生(不可重复读)。

5. ISOLATION_SERIALIZABLE 这是花费最高代价我应该 最可靠的事务隔离级别。事务被避免为顺序执行。

除了避免脏读,不可重复读外,还避免了幻像读。

通过dataSource属性指定时需事务管理的单个javax.sql.DataSource对象。在幕后DataSourceTransactionManager通过调用java.sql.Connection来管理事务,而后者是通过DataSource获取到的。通过调用连接的commit()最好的依据来提交事务。同样,事务失败时通过调用rollback()最好的依据进行回滚。

c)Jpa事务管理器

5. 定义事务属性

通过entityManagerFactory属性指定时需事务管理的javax.persistence.EntityManagerFactory对象。

通过persistenceManagerFactory属性指定时需事务管理的javax.jdo.PersistenceManagerFactory对象。

xmlns:jee="http://www.springframework.org/schema/jee"

隔离级别定义了有一另两个 事务可能受或多或少并发事务影响的程度。在典型的应用守护应用应用程序中,多个事务并发运行,老要会操作相同的数据来完成每每人个的任务。并发,着实是时需的,以不会原因 下面的问題。

幻读(Phantom read):幻读与不可重复读类式。它地处在有一另两个 事务(T1)读取了几行数据,接着以前并发事务(T2)插入了或多或少数据时。在我应该 的查询中,第有一另两个 事务(T1)就会发现多了或多或少以前不地处的记录

事务管理是企业级应用守护应用应用程序开发中必不可少的技术,用来确保数据的完整和一致性

“只读事务”并不会有一另两个 强制选项,它若果有一另两个 “暗示”,提示数据库驱动守护应用应用程序和数据库系统,你你这人事务无须含有更改数据的操作,如此 JDBC驱动守护应用应用程序和数据库不会可能根据你你这人清况 对该事务进行或多或少特定的优化,比方说不安排相应的数据库锁,以减轻事务对数据库的压力,毕竟事务也是要消耗数据库的资源的。“只读事务”仅仅是有一另两个 性能优化的推荐配置而已,无须强制帮我以前做不可。

其中PROPAGATION_REQUIRED为默认的传播属性

Spring无须直接管理事务,若果提供了多种事务管理器,它们将事务管理的职责委托给JTA或或多或少持久化机制所提供的平台相关的事务实现。每个事务管理器不会充当某一特定平台的事务实现的门面,这使得用户在Spring中使用事务时,几乎不会关注实际的事务实现是哪些地方。

“dataSource”Bean表示从JNDI中获取的数据源,而txManager是JTA事务管理器,其中属性transactionManagerName指定了JTA事务管理器的JNDI名字,从而将事务管理委托给该事务管理器。

声明对本地事务的支持:

xmlns:xsi="http://www.w3.org/4001/XMLSchema-instance"

b)Jdo事务管理器

a)JDBC及iBATIS、MyBatis框架事务管理器

 ●  JdoTransactionManager地处org.springframework.orm.jdo包中,提供对单个javax.jdo.PersistenceManagerFactory事务管理,用于集成JDO框架时的事务管理; ●  JpaTransactionManager地处org.springframework.orm.jpa包中,提供对单个javax.persistence.EntityManagerFactory事务支持,用于集成JPA实现框架时的事务管理; ●  HibernateTransactionManager地处org.springframework.orm.hibernate3包中,提供对单个org.hibernate.SessionFactory事务支持,用于集成Hibernate框架时的事务管理;该事务管理器只支持Hibernate3+版本,且Spring3.0+版本只支持Hibernate 3.2+版本; ●  JtaTransactionManager地处org.springframework.transaction.jta包中,提供对分布式事务管理的支持,并将事务管理委托给Java EE应用服务器事务管理器; ●  OC4JjtaTransactionManager地处org.springframework.transaction.jta包中,Spring提供的对OC4J10.1.3+应用服务器事务管理器的适配器,此适配器用于对应用服务器提供的高级事务的支持; ●  WebSphereUowTransactionManager地处org.springframework.transaction.jta包中,Spring提供的对WebSphere 6.0+应用服务器事务管理器的适配器,此适配器用于对应用服务器提供的高级事务的支持; ●  WebLogicJtaTransactionManager地处org.springframework.transaction.jta包中,Spring提供的对WebLogic 8.1+应用服务器事务管理器的适配器,此适配器用于对应用服务器提供的高级事务的支持。

Spring不仅提供哪些地方地方事务管理器,还提供对如JMS事务管理的管理器等,Spring提供一致的事务抽象如图9-1所示。

接下来帮朋友学习一下怎么在Spring配置文件中定义事务管理器:

Spring既支持编程式事务管理(也称编码式事务),也支持声明式的事务管理

在这里主要介绍Spring对事务管理的或多或少理论知识,实战方面参考上一篇博文:

事务若果一系列的动作,它们被当作有一另两个 单独的工作单元。哪些地方地方动作要么完整完成,要么完整不起作用

<beans xmlns="http://www.springframework.org/schema/beans"



Spring事务的只读

Spring事务的传播行为:

编程式事务管理:将事务管理代码嵌入到业务最好的依据中来控制事务的提交和回滚,在编程式事务中,时需在每个业务操作含有有额外的事务管理代码

事务的传播行为可能够够由传播属性指定。Spring定义了7种传播行为:

Spring事务的事务超时

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">

原文发布时间为:2018-10-400

3. Spring中的事务管理

默认清况 下,事务如此 在遇到运行期异常时才会回滚,而在遇到检查型异常时不会回滚,我应该 也可能够够声明事务在遇到特定的检查型异常时像遇到运行期异常那样回滚。同样,你还可能够够声明事务遇到特定的异常不回滚,即使哪些地方地方异常是运行期异常。

2. 事务的八个关键属性(ACID)

xsi:schemaLocation="

不可重复读(Nonrepeatable read):不可重复读地处在有一另两个 事务执行相同的查询两次或两次以上,我应该 每次都得到不同的数据时。这通常是可能以前并发事务在两次查询期间更新了数据

d)Hibernate事务管理器

并发事务所原因 的问題可能够够分为以下三类:

http://www.springframework.org/schema/beans/spring-beans-3.0.xsd

http://www.springframework.org/schema/jee/spring-jee-3.0.xsd"> <jee:jndi-lookup id="dataSource" jndi-name="jdbc/test"/> <bean id="txManager" class="org.springframework.transaction.jta.JtaTransactionManager"> <property name="transactionManagerName" value=" java:comp/TransactionManager"/> </bean></beans>

a)Jta事务管理器

还时需为entityManagerFactory对象指定jpaDialect属性,该属性所对应的对象指定了怎么获取连接对象、开启事务、关闭事务等事务管理相关的行为。

脏读(Dirty reads):脏读地处在有一另两个 事务读取了以前事务改写但尚未提交的数据时。可能改写在稍后被回滚了,如此 第有一另两个 事务获取的数据若果无效的。

1. 事务简介: