声明式事务
分类
①编程式事务
由程序员来编写事务控制代码
②声明式事务
事务控制代码已经由Spring完成,程序员只需声明那些方法进行事务控制和如何控制
特点
①针对于ServiceImpl类下方法
②基于通知(advice)
③依赖于AOP
实现
①添加命名空间:xmlns:tx、xmlns:aop(依赖于aop)和xsi:schemalocatio
②事务管理器:org.springframework.jdbc.datasource.DataSourceTransactionManager
事务管理器需连接数据库:datasource(属性赋值)
③事务处理:
<tx:advice id="" transaction-manager="事务管理器bean id">
<tx:attributes>
<!--控制具体哪些方法的事务,支持通配符如upd*(所有更新数据库数据操作)-->
<tx:method name="方法名"/>
</tx:attributes>
</tx:advice>
添加切点:事务可能存在的范围,(范围大一点)
添加通知:advice-ref=“tx:advice id”
如:
<!-- 数据库源 -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="DriverClassName" value=""></property>
<property name="url" value=""></property>
<property name="username" value=""></property>
<property name="password" value=""></property>
</bean>
<!--可配置mybatis等数据库操作框架进行相关数据处理-->
<!-- 事务管理器 -->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="datasource"></property>
</bean>
<!-- 切点配置(需要进行事务管理的方法所在位置) -->
<aop:config>
<aop:pointcut expression="execution(com.mfqh.service.*())" id="txCut"/>
<aop:advisor advice-ref="txManager" pointcut-ref="txCut"/>
</aop:config>
<!-- 事务管理 -->
<tx:advice>
<tx:attributes>
<tx:method name="sel*"/>
</tx:attributes>
</tx:advice>
tx:method元素所具有的属性
①name,为需要事务的方法
②readonly=“boolean”,是否只读(只读事务效率较高,提升性能),查询语句使用(true),默认false
③propagation,控制事务传播行为
Ps:事务传播行为(当一个具有事务控制的方法被另一个有事务控制管理的方法调用)
REQUIDER(默认值):若当前有事务,则被调用的方法就不创建事务,在当前事务中执行;若没有,就创建
SUPPORTS:若当前有事务就在事务中执行;若没有就在非事务状态下执行
MANDATORY:必须在事务内部执行,若有事务,执行;若没事务,报错
REQUIRES_NEW:若当前有事务,挂起,新建一个;若没事务,新建,确保两个事务的相对独立
NOT_SUPPORTED:若当前有事务,挂起;若没事务,执行,即中间部分不进行事务管理
NEVER:若当前有事务,报错;若没事务,执行
NESTED:若当前有事务,创建嵌套事务(子事务和主事务有关联);若没事务,新建
④isolation,事务隔离级别
DEAFULT:默认值,由底层数据库自动判断该使用什么隔离级别
READ_UNCOMMITED:读未提交,可以读取读未提交的数据,效率最高
READ_COMMITED:读已提交,只能读取其他事务已提交数据
REPEATABLE_READ:可重复读,要读取的数据被加锁
SERIALIZABLE:序列化,排队操作,对整个表加锁,最安全,效率最低
⑤rollback-for,异常回滚
值为异常类型全限定路径,当手动抛异常,一定添加该属性
⑥no-rollback-for,异常不回滚(用于某些特定异常,停止当前执行)