声明式事务的五大属性
1.传播机制(propagation)
指的是一个带有事务的方法A运行在另一个带有事务的方法B内部时,内层方法A是使用自己的事务还 是使用外层B的事务
required:默认值,表示如果外层方法B有事务,就使用外层方法B的事务,没有就使用自己的事务
requires_new:无论外层方法B有没有事务,内层方法A都使用自己的事务
supports:表示如果外层方法B有事务,就使用外层方法B的事务,如果外层方法B没有事务,就不使用事务
2.隔离级别(isolation):是针对数据库的并发访问的,不同的隔离级别,数据库有着不同的解决方法。
repeatable_read: 默认是 可重复度
read_uncommitted:读未提交
read_committed:读已提交
serializable:串行化读:就是如果设置了这个注解,运行期间就不允许改变值 也就是不允许并发操作。
3.回滚机制 通常只有运行时异常会自动回滚,编译时异常不会回滚,想要让其回滚只有设置rollbackFor
rollbackFor ={一个异常类的字节码} 就是在事务后面的参数列表里面加上 一个异常类的字节码,当你下面遇到这样的异常时 会回滚
no rollbackFor 就是即使是运行时异常,后面如果不想让其回滚,就在事务后加上norollbackFor={运行时异常的类字节码} 下面遇见这种类型的异常就不会自动回滚。
SQLException:本属于编译时异常,但是在遇见spring框架的时候底层被SQLErrorCodeSQLEceptionTranslator重写编译编 转化成了运行时异常 在遇见sqlException异常的时候也会自动回滚。
4.超时属性
:::.事务在数据库执行过程中,势必要消耗数据库的资源,如果让一个事务长期执行,就会影响其他事物的执行,所以一旦一个事务在指定的时间内还没有完成操作就让它回滚。
5.只读属性
readOnly = true 表示 只允许对数据库进行查询读取操作,不能对数据进行增 删 改 操作。
二、配置事务 两种方式
1.基于注解的方式:
注意:不管是基于注解还是xml 都需要先配置事务源
事务源!
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
这种基于注解的方式:
<!-- 一、注解的方式配置事务--> <tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>
然后在service层类或者方法上加上一个事务注解
@Transactional
第二种:基于xml的方式:只需要在配置文件中配置即可。
1 <!--二、基于xml的方式配置事务--> 2 <!--配置事务的通知--> 3 <tx:advice id="interceptor" > 4 <tx:attributes> 5 <tx:method name="save*" propagation="REQUIRED"/> 6 <tx:method name="find*" propagation="REQUIRED"/> 7 <tx:method name="delete*" propagation="REQUIRED"/> 8 <tx:method name="select*" read-only="true"/> 9 <!--所有方法都适应,全局搜索--> 10 <tx:method name="*" read-only="true"/> 11 </tx:attributes> 12 </tx:advice> 13 <!--配置切面--> 14 <aop:config> 15 <aop:pointcut id="pointcut" expression="execution(* com.ujy.service.impl.*.*(..))"/> 16 <!--把切入点和通知类组织到一起成切面--> 17 <aop:advisor advice-ref="interceptor" pointcut-ref="pointcut"/> 18 </aop:config>