博主介绍
上海交大毕业,大厂资深Java后端工程师
《Java全套学习资料》作者
专注于系统架构设计和高并发解决方案和面试辅导
阿里云开发社区乘风者计划专家博主
@author[vx] vip1024p(备注java)
ACID特性
- A:原子性,Atomictiy,事务是最小的执行单位,不允许分割,事务的原子性确保动作要么全部完成,要么完全不起作用.
- C:一致性 Consistency,执行事务前后,数据保持一致.
- I:隔离性Isolation 并发访问数据库时,一个用户的事务不背其他事务所干扰,个并发事务之间数据库相互独立.
- D:持久性 Durability 一个事务被提交之后,它对数据库中数据的改变是持久的,及时数据库发生故障也不应该对其有任何影响.
并发事务可能带来哪些问题
更新丢失: 当两个或多个事务选择同一行,然后基于最初选定的值更新该行时,由于每个事务都不知道其他事务的存在,就会发生丢失更新问题,最后的更新覆盖了由其他事务所做的更新.
**脏读:**当一个事务正在访问数据并且对数据进行了修改,而这种修改还没提交到数据库中,这是另一个事务也访问了这个数据,然后使用了这个数据.因为这个数据是没有提交的,那么读到的这个数据就是’脏数据’
**不可重复读:**一个事务多次读同一个数据,在这个事务还没结束的时候,另一个事务也访问该数据.那么第一事务的两次读取数据之间,由于第二个事务的修改导致一个事务内两次读到的数据是不太一样的情况,因此称为不可重复读.
**幻读:**幻读与不可重复读类似,它发生在一个事务(T1)读取了将数据,接着另一个并发事务(T2)插入了一些数据时.在随后的查询中,第一个实物(T1)就会发现多了一些原本不存在的记录.就好像发生了幻卷一样,所以称为幻读.
不可重复读和幻读的区别,不可重复读的重点是修改,比如多次读取一条记录发现其中某列的值被修改.
幻读的重点在于新增和删除,比如多次读取一条记录,发现记录增多或减少了.
事务隔离级别
READ-UNCOMMITED 读未提交: 最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读、不可重复读。
**READ-COMMITED 读已提交:**允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读和不可重复读礽有可能发生.
REPEATABLE-READ 可重复读: 对同一字段的多次读取结果都是一致的.除非数据是被本身事务自己修改,可以防止脏读和不可重复读.但是幻读仍有可能发生.
SERIALIZABLE 可串行化: 最高的隔离级别,完全服从ACID的隔离级别,所有的事务依次执行,这样事务之间就不可能存在干扰,也就是该级别可以防止脏读、幻读、不可重复读.
MySQL默认的隔离级别是REPEATABLE-READ
Spring Boot 设置事务隔离级别
Spring Boot的自动装配,已经为我们引入了事务,所以我们之际使用注解@Transcational操作事务即可.
Spring Boot设置事务隔离级别可以通过注解@Transcational(isolation=Isoliation.事务等级),如:
@Transcational(isolation=Isolation.REPEATABLE_READ)
Spring使用事务
使用注解的方式实现事务管理
使用注解方式实现事务管理,需要我们在配置文件中线配置事务管理器.
<bean id="transactionManager" class="org.springframework.jdbc.datasourse.DataSourceTransactionManager">
<!--注入数据源-->
<property name="dataSource" ref="dataSource" />
</bean>
<!--开启事务注解-->
<tx:annotation-driven transactionmanager="transactionManager"/>
在service类或者service类中的方法上添加事务的注解@Transactional,注解 参数如下:
属性名
默认值
含义
name
方法名,可以使用通配符,遵循ant风格:必填
propagation
REQUIRED
事务传播行为;可取值包括REQURIED | SUPPORTS | MANDATORY |
REQUIRES_NEW | NOT_SUPPORTED | NEVER | NESTED
isolation
DEFAULT
事务隔离级别;可取值包括DEFAULT | READ_UNCOMMITED | READ_COMMITED | REPEATABLE_TEAD | SERIALIZABLE
timeout
-1
事务超时时间,单位:秒
read-only
false
是否为只读事务
rollback-for
异常类,遇到该异常会回滚事务,默认RuntimeException或Error异常
no-rollback-for
异常类,遇到该异常时不需要回滚
完全注解方式配置事务
将xml配置文件改为使用configuration注解的配置类配置.其他不变.
xml配置文件实现事务管理
-
配置事务管理器
-
配置通知
-
配置切入点和切面
<tx:advice id="txadvice>
tx:attributeds
<tx:method name=“accountMoney” propagation=“REQUIRED”/>
</tx:attrbuteds>
</tx:advice>aop:config
<aop:pointcut id=“pt” expression=“execution(全类名.(…))”/>
<aop:advisor advice-ref=“txadvice” pointcut-ref=“pt”/>
</aop:config>
Spring事务传播行为
- REQUIRED 默认的事务传播级别,他表示如果当前存在事务,则加入该事务,如果当前没有事务,则创建一个新的事务.
- SUPPORTS 如果当前存在事务,则加入该事务,如果当前没有事务,则以非事务的方式继续运行.
- MANDATORY 如果当前存在事务,则加入该事务,如果当前没有事务,抛出异常.
- REQUIREDS_NEW 表示创建一个新事务,如果当前存在事务,则把当前事务挂起
- NOT_SUPPORTED 表示以非事务方式运行,如果当前存在事务,则把当前事务挂起.
- NEVER 以非事务的方式运行,如果当前存在事务,抛出异常
- NESTED 如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来执行,如果不存在事务,则创建一个新的事物.