- 编程式事务
由程序员编程事务控制代码 - 声明式事务
事务控制代码由Spring写好,
声明式事务都是针对ServiceImpl类下的方法
事务管理器是基于通知的(Advice)
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<!-- 如果当前有事务,就在当前事务执行,如果当前没事务,就开启一个新事物 -->
<tx:method name="ins*" propagation="REEQUIRED"></tx:method>
<!-- 如果当前有事务,就在当前事务执行,如果当前没事务,就在非事务执行 -->
<tx:method name="ins*" propagation="SUPPORTS"></tx:method>
<!-- 如果当前有事务,就在当前事务执行,如果当前没事务,就会报异常 -->
<tx:method name="ins*" propagation="MANDATORY"></tx:method>
<!-- 如果当前有事务,当前事务挂起,如果当前没事务,就会开一个新事务 必须在事务中执行-->
<tx:method name="ins*" propagation="REQUIRES_NEW"></tx:method>
<!-- 不在事务中执行,如果当前有事务,当前事务挂起 -->
<tx:method name="ins*" propagation="NOT_SUPPORTED"></tx:method>
<!-- 在非事务中执行,如果当前有事务,报异常 -->
<tx:method name="ins*" propagation="NEVER"></tx:method>
<!-- 在事务中执行,如果当前有事务,创建嵌套事务,如果没事务,就新建事务
-->
<tx:method name="ins*" propagation="NESTED" rollback-for="java.lang.Exception" no-rollback-for=""></tx:method>
<!--配置只读,提高性能 -->
<tx:method name="query*" read-only="true" isolation=“”default“”></tx:method>
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut expression="execution(* com.*.*(..))" id="point"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="point"/>
</aop:config>
事务隔离级别 isolation
脏读
不可重复读
幻读
- READ_UNCOMMITTED
- READ_COMMITTED
- REPEATABLED_READ
- SERIALIZABLE