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; } }