shuiluobu 2020-06-03
如果不配置spring的事务,那么默认每次执行dao层方法即自动提交事务。
<!--配置事务管理器--> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <!--配置datasource--> <property name="dataSource" ref="dataSource"/> </bean> <!--配置事务传播特性和 事务隔离级别--> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <!--配置事务传播特性 method为方法名, propagation配置事务传播特性 isolation="" 指定事务隔离级别--> <!-- name:指定切入点的方法名,匹配的方法才能够指定到事务传播特性和隔离级别--> <tx:method name="save*" propagation="REQUIRED" isolation="READ_COMMITTED" /> <tx:method name="insert*" propagation="REQUIRED" isolation="SERIALIZABLE"/> <tx:method name="update*" propagation="REQUIRED" /> <tx:method name="delete*" propagation="REQUIRED" /> <!--查询操作 配置read-only=true,标识为只读事务。--> <tx:method name="find*" propagation="REQUIRED" read-only="true" /> <tx:method name="get*" propagation="REQUIRED" read-only="true" /> <tx:method name="select*" propagation="REQUIRED" read-only="true" /> </tx:attributes> </tx:advice>
Spring事务管理方式有两种
1) 编程式事务:以java编码的方式来实现事务的管理。基本不使用。
2) 声明式事务:只需要申明配置事务的处理方式,spring会自动进行事务管理。
a. 事务管理器
b. 事务的传播特性:事务的传播特性用来定义事务中又存在事务的情况下,该如何来处理事务。(Service层方法调用service层方法时)
a) Required:必须,必须有一个事务,如果没有,则会开启一个事务。如果有,则使用当前事务。(默认)
b) Requireds_new:(需要自己的新的事务) 必须运行在自己的事务中,即使当前方法存在一个事务,也会新建一个自己的事务。执行本身事务时,会将外部事务挂起。
c) Nested:(嵌套)可以多个事务嵌套在一起,内部事务不会影响外部事务,外部事务回滚,会影响到内部事务回滚。
d) Mandtory: (必须有事务)要求必须有事务,没有事务就抛出异常。
e) Never:(永不) 不支持事务,有事务就抛出异常。
f) Supports:(支持) 如果 有事务和没有事务都支持。
g) not_supported :(不支持事务),有事务存在,便不运行,直到事务提交后再执行。
c. 事务的隔离级别:
a) READ_UNCOMMITTED:读未提交
b) READ_COMMITTED:读已提交
c) REPEATABLE_READ:可重复读
d) SERIALIZABLE:串行化
e) DEFAULT:按照数据库默认的隔离级别。(默认)
d. 事务AOP,将事务切入到对应的方法。
e. 以注解的形式配置
a) 在spring的配置文件中配置启用事务注解
<tx:annotation-driven/>
b) 在需要事务处理的类或方法上面添加事务注解
@Transactional(propagation=Propagation.REQUIRED,isolation=Isolation.READ_COMMITTED)