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