声明式事务
作者:互联网
8、声明式事务
8.1、事务ACID原则
- 原子性(atomicity)
- :事务中包括的操作要么都做,要么都不做
- 一致性 (consistency)
- :针对一个事务操作前与操作后的状态一致
- 隔离性(isolation)
- :一个事务的执行不能被其他事务干扰
- 造成的问题:
- 脏读:指一个事务读取了另外一个事务未提交的数据
- 不可重复读:在一个事务内读取表中的某一行数据,多次读取结果不同(数据内容不一致)
- 幻读:是指在一个事务内读取到了别的事务插入的数据,导致前后读取到的数据不一致
- 持久性 (durability)
- :指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的,不可逆的
- 如果在操作之前(事务还没有提交)服务器宕机或者断电,那么重启数据库之后,数据状态还是操作之前的,恢复到原状
- 如果在操作后(事务已经提交)服务器宕机或者断电,那么重启数据库之后,数据状态应为操作之后的,持久化到数据库
- :指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的,不可逆的
8.2、spring中配置声明式事务
-
配置声明事务
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean>
-
结合AOP实现事务的织入
-
配置事务通知
<tx:advice id="transactionInterceptor" transaction-manager="transactionManager"> <tx:attributes> <!-- 需要开启事务订单方法 --> <!-- 传播特性 propagation 默认是REQUIRED--> <!-- read-only="true"表只读事务--> <tx:method name="queryAllUser" propagation="REQUIRED"/> <tx:method name="deleteUserById" propagation="REQUIRED"/> <tx:method name="addUser" propagation="REQUIRED"/> <tx:method name="*"/> </tx:attributes> </tx:advice>
-
propagation
传播行为(PROPAGATION) 描述 PROPAGATION_REQUIRED 如果当前没有事务,就新建一个事务,如果已存在一个事务中,加入到这个事务中,这是最常见的选择。 PROPAGATION_SUPPORTS 支持当前事务,如果没有当前事务,就以非事务方法执行 PROPAGATION_MANDATORY 使用当前事务,如果没有当前事务,就抛出异常 PROPAGATION_REQUIRES_NEW 新建事务,如果当前存在事务,把当前事务挂起 PROPAGATION_NOT_SUPPORTED 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起 PROPAGATION_NEVER 以非事务方式执行操作,如果当前事务存在则抛出异常 PROPAGATION_NESTED 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED 类似的操作 原文链接:https://blog.csdn.net/zhangsweet1991/article/details/83897211
-
-
事务的切入 ,我用的这个版本spring开启事务的时候需要把proxy-target-class="true"开启cglib的方式
<!-- - 事务的切入--> <aop:config proxy-target-class="true"> <aop:pointcut id="txPointcut" expression="execution(* com.mhy.mapper.*.*(..))"/> <aop:advisor advice-ref="transactionInterceptor" pointcut-ref="txPointcut"/> </aop:config>
标签:事务,读取,PROPAGATION,当前,如果,操作,声明 来源: https://www.cnblogs.com/shuisanya/p/16055794.html