spring学习笔记声明式事务
Posted 拐柒
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring学习笔记声明式事务相关的知识,希望对你有一定的参考价值。
声明式事务
编程式事务:和声明式事务对应的是编程式事务,编程式事务在业务代码中添加事务控制代码,这样的事务控制机制就叫编程式事务。
声明式事务:通过xml或者注解配置的方式打到事务控制的目的,叫声明式事务。
事务
事务是指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部不成功,确保数据的准确和安全。
事务四大特性
原子性
事务是一个不可分割的工作单位,从操作的角度来描述,事务中的操作要么都发生,要么都不发生。
一致性
一致性是从数据的角度来描述的,例如转账之前,A有1000,B有1000。转账之后,A+B还要等于2000
隔离性
隔离性就是多个用户并发访问数据库时,数据库为没一个用户开启的事务,每个事务不能被其他事务的操作数据所干扰,多个并发事物之间要相互隔离。避免脏读。
持久性
持久性是指一个事务一旦被提交,它对数据库中的数据的改变就是永久性的,接下来及时数据库发生故障也是不应该有任何影响。
事务的隔离级别
隔离级别解决事务并发问题,
脏读 :一个线程中的事务读到了另外一个线程中未提交的数据。
不可重复读:一个线程中的事务读到了另外一个线程中已经提交的update的数据(前后内容不一样)
虚读(幻读)一个线程中的事务读到了另外一个线程中已经提交的insert或者delete的数据(前后条数不一样)
事务隔离级别:
Serializable(串行化):可避免脏读、不可重复读、幻读的情况发生。级别最高。
Repeatable read(可重复读):可避免脏读、不可重复读情况的发生。(幻读有可能发生) 级别第二。该机制下,会对要update的行进行加锁。
Read committed(读已提交):可避免脏读情况发生。不可重复读和幻读一定会发生。级别第三。
Read Uncommitted(读未提交):最低级别,以上情况均无法保证。级别最低。
随着隔离级别的升高,效率也一次降低。
mysql默认的事务隔离级别:Repeatable read(可重复读)
查询当前使用的隔离级别:select @@tx_isolation;
事务传播行为
事务旺旺在service层进行控制,如果出现service层方法A调用了另一个service层中的方法B,A和B本身都已经被添加了事务控制,那么A调用B的时候,就需要进行事务协商,这就叫做事务的传播。
A调用B,我们站在B的角度来观察来定义事务的传播行为一般情况下,我们使用以下两种方式来处理:
PROPAGATION_REQUIRED:如果当前事务没有事务,就新建一个事务,如果已经存在一个事务,那么加入到这个事务中。
PROPAGATION_SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行(非事务方式执行一般存在于select的时候)
基于springAOP的声明式事务
纯xml模式
<!--spring 声明式事务-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<constructor-arg name="dataSource" ref="dataSource"></constructor-arg>
</bean>
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<!-- 定制事务细节,传播行为、隔离级别-->
<tx:attributes>
<!-- 一般性配置-->
<tx:method name="*" read-only="false" propagation="REQUIRED" isolation="DEFAULT" timeout="-1"/>
<!-- 针对查询的覆盖性-->
<tx:method name="query*" read-only="true" propagation="SUPPORTS" isolation="DEFAULT" timeout="-1"/>
</tx:attributes>
</tx:advice>
<aop:config>
<!--advice-ref指向增强=横切逻辑+方位-->
<aop:advisor advice-ref="txAdvice" pointcut="execution(* com.lagou.edu.service.impl.TransferServiceImpl(..))"/>
</aop:config>
纯注解模式
在启动类上添加@EnableTransactionManagement
以上是关于spring学习笔记声明式事务的主要内容,如果未能解决你的问题,请参考以下文章
spring学习笔记(22)声明式事务配置,readOnly无效写无异常
Spring5学习笔记(14) — “Spring5 声明式事务管理”
Spring5学习笔记(14) — “Spring5 声明式事务管理”