事务管理
事务的概念
Spring 事务管理模块的特点
声明方式的事务管理
------------------------
事务的概念:
价值:
保证原子操作,并发,网络或机器故障
事务的特性:
原子性(Atomic)
一致性(Consistent)
隔离性(Isolated)
永久性(Durable)
Spring 事务管理模块的特点:
1)多种平台事务管理器:
DataSourceTransactionManager
依赖 DateSource
HibernateTransactionManager
依赖 SessionFactory
2)两种定义事务边界的方式:
编程方式:通过程序代码控制
声明方式:通过XML或者标注声明
声明方式的事务管理
五种事务属性选项:
传播 :事务的嵌套规则
PROPAGATION_REQUIRED
PROPAGATION_SUPPORTS
只读 :用于暗示底层存储的优化
readOnly
回滚条件:在方法抛出异常后事务是否回滚
缺省时,事务只在方法抛出Unchecked Exception 回滚
隔离 :四种级别,定义事务数据的独立性
ISOLATION_READ_UNCOMMITTED,ISOLATION_READ_COMMITTED
ISOLATION_REPEATABLE_READ , ISOLATION_SERIALIZABLE
超时 :事务最长等待时间
传播属性是必须的,其他可选
三种实施方式:
方式一 :使用 TransactionProxyFactoryBean 生成代理(见API DOC)
方式二 :使用 Spring2 引入的 tx 及 aop 命名空间
示例:
先定义事务 advice
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="update*" propagation="REQUIRED" />
<tx:method name="*" propagation="SUPPORTS" read-only="true"/>
</tx:attributes>
</tx:advice>
再通过aop织入
<aop:config>
<aop:advisor
pointcut="execution(* *..BankService.*(..))"
advice-ref="txAdvice"/>
</aop:config>
方式三 :使用 标注
示例:
首先,xml 声明:
<tx:annotation-driven transaction-manager="txManager" />
然后,在类或方法上标注:
@Transactional(propagation=Propagation.SUPPORTS, readOnly=true)
public class BankServiceImpl implements BankService {
…
@Transactional(propagation=Propagation.REQUIRED, readOnly=false)
public void open(Account a) {
…
}
…
}
此标注也可以用于接口及接口的方法上