文章目录
开篇
🚁如果还不清楚事务是干什么的,可以先去了解一下,这里简单解释:
我希望做这件事要成功就一起成功,要失败就一起失败,不要成功一半
看完本篇博文将掌握:
- spring事务管理3个核心接口
- 了解到spring事务管理的两种方式
- 掌握基于xml配置文件和Annotation声明式事务的使用方式
🙋♀️ACID原则
- 原子性
- 一致性
- 隔离性
- 持久性
spring事务管理
1、事务管理的核心接口包位置和3个核心接口
PlatformTransactionManager
这个接口是spring提供的事务管理器,主要用户管理事务
它只有3个方法:
1️⃣
TransactionStatus getTransaction(@Nullable TransactionDefinition definition)
throws TransactionException;
用来获取事务状态信息:Return a currently active transaction or create a new one, according to the specified propagation behavior.
2️⃣
void commit(TransactionStatus status) throws TransactionException;
用来提交事务
3️⃣
void rollback(TransactionStatus status) throws TransactionException;
回滚事务
我们熟悉的JDBC就是它的一个实现类之一
还有Hibernate事务管理器、全局事务管理器
这个接口十分的重要,它是所有的具体持久层技术的核心之一,当底层采用不同的持久层技术时,系统只需要使用不同的PlatformTransactionManager实现类即可
TransactionDefinition
Interface that defines Spring-compliant transaction properties.
该接口是事务定义(描述)的对象,其中定义了事务规则,并提供了获取事务相关信息的方法
可能会有疑惑的地方,这里先说事务传播🕵️♀️
在这里的REQUIRED就是属于一种“传播行为”,表示当前方法必须运行在一个事务环境中,如果当前方法已经处于了一个事务环境中了,则肯定就直接使用这个方法,否则会开启另一个新的事务!它也是spring默认的传播行为
其实上面的几个传播行为种类也很好理解,这里就举几个例子
比如:
Support:就是如果当前的方法处于事务环境中,则使用当前事务,否则就不适用
Never:不支持当前的事务,如果使用了,则会抛异常
所以这个接口类,可以控制是否需要创建事务以及如何创建事务,简单的查询一般用不上事务,但是对于增删改,必须要进行事务管理
spring默认的传播行为REQUIRED
TransactionStatus
最后一个核心接口,这个接口是事务状态的描述,它的方法也不多:
好像根据不同的版本的包,里面的方法不一致,4.6版本好像有6个方法,我这里是5.3.15版本,只有两个方法:
- hasSavepoint()表示获取是否存在的点
- flush()表示刷新事务
spring事务管理类型
- 声明式事务:通过AOP技术实现的事务管理
- 编程式事务:需要在代码中,进行事务的管理,这里就包括了你要定义事务的开始、正常执行过程、以及事务的提交和异常事务回滚等,比较麻烦(现在不常用,一般用声明式事务)
声明式事务
实现方法:
- 基于XML
- 基于Annotation
基于XML
在spring中配置文件中和事务有关配置总是由3个部分组成:
1、dataSource
2、TransactionManager
3、代理机制
一般来说变化的只是代理机制而已,前面两个只会根据数据访问方式而变化💜
想要看一些例子的话,这里有几班过路车:
快上车,Spring快速整合Mybatis实现方法一
二班车,Spring快速整合Mybatis实现方法二(SqlSessionDaoSupport +事务处理)
点击查看本专栏,还有后面几班车,就不一 一展示了
基于Annotation注解方式
这个方式应该是现阶段比较流行的一种方式,这个方式比在xml中配置简单不少,这里只是简单演示
步骤如下:
1、配置声明事务
<!-- 1、配置声明式事务-->
<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" />
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!-- <constructor-arg ref="dataSource" />-->
<property name="dataSource" ref="dataSource"/>
</bean>
2、直接在想要配置事务的方法上方,添加@Transactional注解即可
以下的例子来自二班车噢🙌
@Override
@Transactional
public List<User> select() {
User user = new User(6, "小明", "846328");
UserMapper mapper = getSqlSession().getMapper(UserMapper.class);
mapper.addUser(user);
mapper.delete(6);
return mapper.select();
// return getSqlSession().getMapper(UserMapper.class).select();
}