spring——事务处理基础篇
# 事务定义
把一组业务当成一个业务来做;要么都成功,要么都失败,保证业务操作完整性的一种 数据库机制。
# 事务的四大特性
A 原子性:原子性指的是 在一组业务操作下 要么都成功 要么都失败
在一组增删改查的业务下 要么都提交 要么都回滚
C 一致性:事务前后的数据要保证数据的一致性
在一组的查询业务下 必须要保证前后关联数据的一致性
I 隔离性:在并发情况下 事物之间要相互隔离。
D 持久性:数据一旦保存就是持久性的。
# Spring事务的实现方式和实现原理
两种实现方式:
1、编程式事务,(需要在代码逻辑中添加事务代码,常用代码 connection.setAutoCommit(false))beginTransaction()、commit()、rollback())
2、声明式事务
配置文件中配置事务管理,
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!--开启基于注解的事务控制模式,依赖tx名称空间-->
<tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>
在类或方法上添加@Transcational注解
原理 Spring的事务管理机制实现的原理,就是通过这样一个动态代理对所有需要事务管理的Bean进行加载,并根据配置在invoke方法中对当前调用的 方法名进行判定,并在method.invoke方法前后为其加上合适的事务管理代码,这样就实现了Spring式的事务管理。Spring中的AOP实 现更为复杂和灵活,不过基本原理是一致的
#说一下Spring的事务传播行为
https://www.cnblogs.com/happy4java/p/11206804.html
事务的传播是指在一个service的方法中调用另一个service的方法时,两个方法上加了@Transcational注解,使用不同的传播方式对事务的影响。
共七个事务传播行为:
Propagation.REQUIRED
如果当前存在事务,则加入该事务,如果当前不存在事务,则创建一个新的事务。
Propagation.SUPPORTS
如果当前存在事务,则加入该事务;如果当前不存在事务,则以非事务的方式继续运行。
Propagation.MANDATORY
如果当前存在事务,则加入该事务;如果当前不存在事务,则抛出异常。
Propagation.REQUIRES_NEW
重新创建一个新的事务,如果当前存在事务,延缓当前的事务。
Propagation.NOT_SUPPORTED
以非事务的方式运行,如果当前存在事务,暂停当前的事务。
Propagation.NEVER
以非事务的方式运行,如果当前存在事务,则抛出异常。
Propagation.NESTED
如果没有,就新建一个事务;如果有,就在当前事务中嵌套其他事务。
#说一下 spring 的事务隔离
事务隔离是为了处理并发过程中读取同一个数据出现的问题,包括脏度,不可重复读,幻读。
- 脏度:
t1读取数据时,t2执行更新操作失败,t1读取的数据是更新操作回滚之前的数据。 设置隔离级别为 READ_COMMITED解决脏度; - 不可重复读:
一个事务中,多次读取相同的数据, 但是读取的结果不一样, 会在本事务中产生数据不一致的问题。 t1读取数据时,t2执行更新数据操作,t1在t2更新前后读取的数据不一致。
@Transactional(isolation = Isolation.REPEATABLE_READ)
确保Transaction01可以多次从一个字段中读取到相同的值,即Transaction01执行期间禁止其它事务对这个字段进行更新。(行锁) - 幻读:
一个事务中,多次对数据进行整表数据读取(统计),但是结果不一样, 会在本事务中产生数据不一致的问题。
解决方式:@Transactional(isolation = Isolation.SERIALIZABLE)
串行化:SERIALIZABLE
确保Transaction01可以多次从一个表中读取到相同的行,在Transaction01执行期间,禁止其它事务对这个表进行添加、更新、删除操作。可以避免任何并发问题,但性能十分低下。(表锁)
spring有五种隔离级别:
隔离级别 描述
DEFAULT 使用数据库本身使用的隔离级别ORACLE(读已提交) MySQL(可重复读)
READ_UNCOMITTED 读未提交(脏读)最低的隔离级别,一切皆有可能。
READ_COMMITED 读已提交,ORACLE默认隔离级别,有幻读以及不可重复读风险。
REPEATABLE_READ 可重复读,解决不可重复读的隔离级别,但还是有幻读风险。
SERLALIZABLE 串行化,最高的事务隔离级别,不管多少事务,挨个运行完一个事务的所有子事务之后才可以执行另外一个事务里面的所有子事务,这样就解决了脏读、不可重复读和幻读的问题了
##Spring框架的事务管理有哪些优点
-提供事务管理模板,为各种数据库的事务处理提供统一的处理方式。
-声明式事务编程,简化开发。(hibernate事务管理需要获取session,在session中处理事务的提交回滚操作)