Spring in action 2 学习笔记
第6章 事务管理
6.1理解事务
事务在软件中扮演了一个重要的角色,用于确保数据和资源永远不会处于一种不一致的状态下。没有事务,就可能会出现数据被破坏,或者是应用程序中的业务规则缺乏一致性。
6.1.1仅有4个词解释事务
ACID 事务的四要素
原子性(Atomic)---事务有一个或多个行为捆绑在一起组成,好像是一个单独的工作单元。原子性确保在事务中的所有操作要么都发么要么都并不发生。假如所有行为都成功了那么相应的事务就是成功的,假如任何一个行为失败了,那么整个事务就失败了,并且被回滚。
一致性(Consistent)---一旦一个事务结束了(不管成功与否),系统所处的状态和它的业务规则是一致的,用现实中的话就是所有数据应当不会被破坏
隔离性(Isolated)---事务应该允许多名用户操作同一个数据,一名用户的操作不会和其他用户的操作想混淆,因此事务必须是相互隔离的,防止并行读写同一个数据的情况发生。注意隔离通常意味着要锁定数据库里的记录行或表
持久性(Durable)---一旦事务完成,事务的结果应该持久化这样不管什么样的系统崩溃他们都将幸免于难。通常把事务的结果保存在数据库或其他形式的持久化存储设备中
小结:当任何一步失败率,事务就能通过撤销所有步骤的结果来保证原子性,原子性支持一致性因为它确保系统中的数据永远不处于一中不一致的,部分完成的状态。隔离性也支持一致性,最后结果将被持久化,因为他们将提交到某个持久化存储中,当系统崩溃了或发生其他灾变性时间时,你就不用担心该事务的结果会丢失。
6.1.2 理解Spring对事务管理的支持
Spring和EJB一样都支持编程式事务和声明式事务,spring的事务管理能力要超过EJB
EJB的事务管理和JTA密不可分,spring使用一种回调机制。如果你的应用程序只使用单一的持久化资源(我理解就是不基于分布式),那么spring就可以使用该持久性机制本身所提供的事务管理支持,这些机制包括JDBC,HIBERNATE,JDO,OJB,等然而如果你的应用程序有跨越多个资源的事务组成(个人理解基于分布式),那么spring可以使用基于第三方的JTA实现支持分布式事务。
编程式事务管理能让你在代码中精确的定义事务边界,声明式事务则有助于把一个操作从其事务规则中分离出来(抽离到XML配置文件中或基于注解方式),Spring对声明式事务的支持,让人联想其EJB的容器管理事务CMT,他们都允许你声明式地定义事务边界,但是Spring的声明式事务要胜过CMT,因为它允许你声明额外的参数,诸如隔离级别和超时设定。
无论你是使用编程式事务还是使用声明式事务,很大程度是在细微控制和简便操作之间做出决定。
不管你是选择在bean中编写事务还是像切面(ASPECT)那样声明他们,你都将使用一个spring的事务管理器连接特定平台的事务实现,
6.2 选择事务管理器
Spring不直接管理事务,相反它提供很多可供选择的事务管理器,将事务管理的责任委托给由JTA或相应的持久性机制的某个特定平台事务实现
事务管理器实现(org.springframework.*) 使用时机
Jdbc.datasource.DataSourceTransactionManager 正在使用spring的JDBC抽象实现。
Orm.hibernate3.HibernateTransactionManager 正在为持久性使用hibernate3
Orm.jpa.JpaTrasactionManager 正在为持久性使用JPA
Transaction.jta.JtaTransactionManager 需要分布式事务或者在没有其他事务管理器符合要求时
以上只是列举了比较常用的事务管理器,它们充当了某一特定平台的事务实现的门面
Spring的事务管理器
特定平台的事务实现
要使用一个事务管理器,就需要把它配置到applicationContext.XML中
6.2.1 JDBC事务
6.2.2 Hibernate事务
Hibernate 3.x
6.2.3 JPA事务
6.2.4 JTA事务
第6章 事务管理
6.1理解事务
事务在软件中扮演了一个重要的角色,用于确保数据和资源永远不会处于一种不一致的状态下。没有事务,就可能会出现数据被破坏,或者是应用程序中的业务规则缺乏一致性。
6.1.1仅有4个词解释事务
ACID 事务的四要素
原子性(Atomic)---事务有一个或多个行为捆绑在一起组成,好像是一个单独的工作单元。原子性确保在事务中的所有操作要么都发么要么都并不发生。假如所有行为都成功了那么相应的事务就是成功的,假如任何一个行为失败了,那么整个事务就失败了,并且被回滚。
一致性(Consistent)---一旦一个事务结束了(不管成功与否),系统所处的状态和它的业务规则是一致的,用现实中的话就是所有数据应当不会被破坏
隔离性(Isolated)---事务应该允许多名用户操作同一个数据,一名用户的操作不会和其他用户的操作想混淆,因此事务必须是相互隔离的,防止并行读写同一个数据的情况发生。注意隔离通常意味着要锁定数据库里的记录行或表
持久性(Durable)---一旦事务完成,事务的结果应该持久化这样不管什么样的系统崩溃他们都将幸免于难。通常把事务的结果保存在数据库或其他形式的持久化存储设备中
小结:当任何一步失败率,事务就能通过撤销所有步骤的结果来保证原子性,原子性支持一致性因为它确保系统中的数据永远不处于一中不一致的,部分完成的状态。隔离性也支持一致性,最后结果将被持久化,因为他们将提交到某个持久化存储中,当系统崩溃了或发生其他灾变性时间时,你就不用担心该事务的结果会丢失。
6.1.2 理解Spring对事务管理的支持
Spring和EJB一样都支持编程式事务和声明式事务,spring的事务管理能力要超过EJB
EJB的事务管理和JTA密不可分,spring使用一种回调机制。如果你的应用程序只使用单一的持久化资源(我理解就是不基于分布式),那么spring就可以使用该持久性机制本身所提供的事务管理支持,这些机制包括JDBC,HIBERNATE,JDO,OJB,等然而如果你的应用程序有跨越多个资源的事务组成(个人理解基于分布式),那么spring可以使用基于第三方的JTA实现支持分布式事务。
编程式事务管理能让你在代码中精确的定义事务边界,声明式事务则有助于把一个操作从其事务规则中分离出来(抽离到XML配置文件中或基于注解方式),Spring对声明式事务的支持,让人联想其EJB的容器管理事务CMT,他们都允许你声明式地定义事务边界,但是Spring的声明式事务要胜过CMT,因为它允许你声明额外的参数,诸如隔离级别和超时设定。
无论你是使用编程式事务还是使用声明式事务,很大程度是在细微控制和简便操作之间做出决定。
不管你是选择在bean中编写事务还是像切面(ASPECT)那样声明他们,你都将使用一个spring的事务管理器连接特定平台的事务实现,
6.2 选择事务管理器
Spring不直接管理事务,相反它提供很多可供选择的事务管理器,将事务管理的责任委托给由JTA或相应的持久性机制的某个特定平台事务实现
事务管理器实现(org.springframework.*) 使用时机
Jdbc.datasource.DataSourceTransactionManager 正在使用spring的JDBC抽象实现。
Orm.hibernate3.HibernateTransactionManager 正在为持久性使用hibernate3
Orm.jpa.JpaTrasactionManager 正在为持久性使用JPA
Transaction.jta.JtaTransactionManager 需要分布式事务或者在没有其他事务管理器符合要求时
以上只是列举了比较常用的事务管理器,它们充当了某一特定平台的事务实现的门面
Spring的事务管理器
特定平台的事务实现
要使用一个事务管理器,就需要把它配置到applicationContext.XML中
6.2.1 JDBC事务
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
6.2.2 Hibernate事务
<bean id="transactionManager"
class="org.springframework.orm.hibernate.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
Hibernate 3.x
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
6.2.3 JPA事务
<bean id="transactionManager"
class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>
6.2.4 JTA事务
<bean id="transactionManager"
class="org.springframework.transaction.jta.JtaTransactionManager">
<property name="transactionManagerName"
value="java:/TransactionManager"/>
</bean>