下表显示了不同隔离级别允许的并发副作用。
隔离级别
|
脏读
|
虚拟读取
| |
---|---|---|---|
未提交读
|
是
|
是
|
是
|
已提交读
|
否
|
是
|
是
|
否
|
否
|
是
|
|
快照
|
否
|
否
|
否
|
可序列化
|
否
|
否
|
否
|
事务传播机制
事务传播行为类型 |
说明 |
PROPAGATION_REQUIRED |
如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是 最常见的选择。 |
PROPAGATION_SUPPORTS |
支持当前事务,如果当前没有事务,就以非事务方式执行。 |
PROPAGATION_MANDATORY |
使用当前的事务,如果当前没有事务,就抛出异常。 |
PROPAGATION_REQUIRES_NEW |
新建事务,如果当前存在事务,把当前事务挂起。 |
PROPAGATION_NOT_SUPPORTED |
以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。 |
PROPAGATION_NEVER |
以非事务方式执行,如果当前存在事务,则抛出异常。 |
PROPAGATION_NESTED |
如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与 PROPAGATION_REQUIRED 类似的操作。 |
当使用 PROPAGATION_NESTED 时, 底层的数据源必须基于 JDBC 3.0 ,并且实现者需要支持保存点事务机制。
话不多说,实例走起
实例为是购买股票的案例,实例不是重点,重点是如何配置事务
第一种
<!--第一种配置TransactionProxyFactoryBean 事务代理工厂bean--> <bean class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> <property name="transactionManager" ref="transactionManager"></property> <property name="target" ref="cgyService"></property> <property name="transactionAttributes"> <props> <prop key="cgy">ISOLATION_DEFAULT,PROPAGATION_REQUIRED</prop> </props> </property> </bean>
其中key的值为方法名添加事务回滚的话,在prop节点中添加 “-异常类”,
第二种
<!--第二种 事务注解失败-->
<tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>
相当简洁的一句话,但需要在类中加入@Transaction();
添加事务回滚:
@Transactional(rollbackFor = cgyException.class)
rollbackFor= 异常类.class
第三种
<!--第三种 使用Aspectj aop 配置--> <tx:advice id="myadvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="cgyService" isolation="DEFAULT" propagation="REQUIRED" rollback-for="cgyException"/> </tx:attributes> </tx:advice> <aop:config> <aop:pointcut id="myPoint" expression="execution(* *..dome06.service.*.*(..))"></aop:pointcut> <aop:advisor advice-ref="myadvice" pointcut-ref="myPoint"></aop:advisor> </aop:config>
事务回滚就是rollback-for=“异常类”;
ok!!!!