事务的主要应用:事务主要用于持久层中,即程序和数据库打交道的地方。
事务的基本特性:原子性、一致性、隔离性和持久行。
Spring全面支持事务,并且提供了一致性事务管理,不论是JTA、JDBC、Hibernate、JPA和JDO。
Spring事务的实现原理:基于Spring AOP机制来实现的,在默认的情况下会使用java的动态代理的机制。在Spring中提供2种方式来实现,一种是动态代理(需要提供接口),另一种是CGLIB(用于类)。动态代理机制就要求代理对象来实现一个接口,并在接口中定义需要代理的方法。如果Spring中存在没有接口的类,这是就要使用CGLIB来实现。
在Spring中提供两种事务的实现方式:一种是编程式事务管理,另一种是声明式的事务管理,在实际的开发中提倡使用声明式的事务管理。在Spring提供的两种事务的方法中他们的都是继承于org.springframework.transaction.PlatformTransactionManger接口。
Public interface PlatformTransactionManger {
TransactionStatue getTransaction(TransactionDefinition definition)
throws TransactionException;
void commit(TransactionStatusstatus)throws TransactionException;
void rollback(TransactionStatus status)throwsTransactionException;
}
Spring声明式事务是在AOP的底层之上实现的,这样就可以在方法执行前拦截,拦截时就可以调用相关的事务,从而保证方法完成之后,是提交或者是回滚。
主要使用tx:advice 和aop:config配置声明式事务。在定义声明式事务的时候,主要使用tx:advice、tx:attributes和tx:method来声明事务。
在tx:method方法中Spring定义了七种事务传播的方式:
事务传播行为类型 | 说明 |
PROPAGATION_REQUIRED | 如果当前没有事务,就新建一个事务,如果已经存在一个事务,加入到这个事务,这是最常用的选择。 |
PROPAGATION_SUPPORTS | 支持当前事务,如果当前没有事务,就以非事务的方式执行。 |
PROPAGATION_MANDATORY | 使用当前事务,如果当前没有事务,就抛出异常。 |
PROPAGATION_REQUIRES_NEW | 新建事务,如果当前存在事务,把当前挂起。 |
PROPAGATION_NOT _SUPPORTED | 以非事务的方式执行操作,如果当前存在事务,就把当前事务挂起。 |
PROPAGATION_NEVER | 以非事务方式执行,如果当前存在事务,则抛出异常 |
PROPAGATION_NESTED | 如果当前存在事务,则在嵌套事务内执行。如果当亲没有事务,则执行与PROPAGATION_REQUIRED类似的操作。 |
注解事务,在类的方法上加上@Transactional