Spring事物

Spring事务传播属性(7种)

•  REQUIRED 业务方法需要在一个事务中运行。如果方法运行时 ,已经处在一个事务中 ,那么加入到这个事务中 ,否则自己创建一个事务。 (默认)。

•  NOT-SUPPORTED 声明方法需要事务。如果方法没有关联到一个事务 ,容器会为它开启一个事务 ,如果方法在一个事务中被调用 ,该事务将会被挂起 ,在方法调用结束后 ,原先的事务会恢复执行。

•  REQUIREDNEW 业务方法必须在自己的事务中运行。一个新的事务将被启动 ,而且如果有一个事务正在运行 ,则将这个事务挂起 ,方法运行结束后 ,新事务执行结束 ,原来的事务恢复运行。

•  MANDATORY 该方法必须运行在一个现有的事务中 ,自身不能创建事务 ,如果方法在没有事务的环境下被调用 ,则会抛出异常。

•  SUPPORTS 如果该方法在一个事务环境中运行 ,那么就在这个事务中运行 ,如果在事务范围外调用 ,那么就在一个没有事务的环境下运行。

•  NEVER 表示该方法不能在有事务的环境下运行 ,如果在有事务运行的环境下调用 ,则会抛出异常

•  NESTED 如果一个活动的事务存在, 则运行在一个嵌套的事 务中, 如果没 有活动事务, 则按照REQUIRED事务方式执行。该事务可以独立的进行提交或回滚 ,如果回滚不会对外围事务造成影响

Spring事务隔离级别

•  DEFAULT 使用数据库默认隔离级别

•  READ_UNCOMMITTED 允许读取尚未提交的数据。可能导致脏读、幻读或不可重复读。

•  READ_COMMITTED 允许从已经提交的并发事务读取。可以防止脏读 ,但依然会出现幻读和不可重复读。

•  REPEATABLE_READ 对相同字段的多次读取结果是相同的 ,除非数据被当前事务改变。可以防止脏读和不可重复读 ,但幻读依然出现。

•  SERIALIZABLE 完全符合ACID的隔离级别 ,确保不会发生脏读 ,幻读和不可重复读。

 脏读 :一个事务读取到另一个事务没有提交到的数据。

不可重复读 :在同一事务中 ,多次读取同一数据返回的结果不同。

 幻读 :一个事务读取到另一个事务已经提交的事务。

<!-- Jdbc事务管理器   -->
<bean id="transactionManager"   class="org.springframework.jdbc.datasource.DataSourceTransactionManager">     
        <property name="dataSource" ref="dataSource"/>     
</bean>
<!--   基于XML配置的事务   -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">     
            <tx:attributes>     
                        <!-- propagation事物传播,isolation隔离级别 -->
                        <tx:method name="save*" propagation="REQUIRED" isolation="READ_COMMITTED"/>     
                        <tx:method name="del*"/>     
                        <tx:method name="edit*"/>     
                        <tx:method name="find*" read-only="true"/>     
            </tx:attributes>     
</tx:advice>     
<aop:config>     
            <aop:pointcut expression="execution(* service..*.*(..))" id="myPointcut"/>     
            <aop:advisor advice-ref="txAdvice" pointcut-ref="myPointcut"/>     
</aop:config> 
基于Annotation的事务 
xml
<tx:annotation-driven transaction-manager="transactionManager"/>     

     
java
@Named     
@Transactional     
public class UserSerivce {     
     
@Transactional(readOnly=true)     

public List<User> findAll() {     
             return null;     
             }
}  
原文地址:https://www.cnblogs.com/fudapeng/p/3873644.html