1.初步理解
用生活中”取钱”的例子来理解一下:
去ATM机取500块钱一般有两个步骤,一是输入密码金额银行卡扣掉500元钱,二是ATM出500元现金.这两不有一步没有执行要不是银行亏损500元要么是自己亏损500元,这都是不允许的所有要么就两步全都成功要么就一步都不执行.因此在企业级应用开发中,用事务来确保数据的完整性和一致性
事务的四个特性
A原子性:一组动作要么全不完成,要不完全不起作用
C一致性:一旦事务完成,必须确保与业务结果是一致的,不能是部分成功
I隔离性:可能会有很多事务同时处理相同的数据,因为每个事务都应该与其他事务隔离,防止数据破坏
D持久性:一旦事务完成,无论发生什么样的系统错误,结果都不能收到影响
核心接口
事务管理器
spring并不直接管理事务,而是提供了多种事务管理器,将事务的职责委托给特定平台实现事务机制
spring事务管理器的接口是org.springframework.transaction.PlatformTransactionManager,通过这个接口,spring为各个平台如JDBC等提供了对应的事务管理器,具体实现就是各个平台自己的事情了.该接口提供了三个方法:
Public interface PlatformTransactionManager()...{
// 由TransactionDefinition得到TransactionStatus对象
TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException;
// 提交
Void commit(TransactionStatus status) throws TransactionException;
// 回滚
Void rollback(TransactionStatus status) throws TransactionException;
}
下面介绍常见的平台框架实现事务管理的机制:
JDBC事务
如果应用程序中直接使用JDBC来进行持久化,DataSourceTransactionManager会处理事务边界,在XML中的配置如下:
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
DataSourceTransactionManager是通过调用java.sql.Connection来管理事务的,
Hibernate事务
xml配置如下:
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
sessionFactory属性需要装配一个Hibernate的session工厂,HibernateTransactionManager的实现细节是它将事务管理的职责委托给org.hibernate.Transaction对象,然后从session中获取到的.当事务完成时,HibernateTransactionManager会调用Transaction对象的commit()方法,反之,将会调用rollback()方法
Java持久化API事务
JPA需要使用spring的JpaTransactionManager来处理事务,xml配置如下:
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
JpaTransactionManager只需要装配一个JPA实体管理工厂(javax.persistence.EntityManagerFactory接口的任意实现)。JpaTransactionManager将与由工厂所产生的JPA EntityManager合作来构建事务。
基本事务属性的定义
TransactionDefinition类定义了事务的基本属性包含了五个方面:
传播行为;隔离规则;回滚规则;事务超时;是否只读
public interface TransactionDefinition {
int getPropagationBehavior(); // 返回事务的传播行为
int getIsolationLevel(); // 返回事务的隔离级别,事务管理器根据它来控制另外一个事务可以看到本事务内的哪些数据
int getTimeout(); // 返回事务必须在多少秒内完成
boolean isReadOnly(); // 事务是否只读,事务管理器能够根据这个返回值进行优化,确保事务是只读的
}
传播行为
spring定义了七种传播行为: