2022-08-30
原文作者:键盘林

声明式事务

接上一个程序,导入jar包(支持spring对数据库的控制)

202203062035247391.png

202203062035257712.png

创建TxConfig类

202203062035267293.png

解释:调用dataSource()获取数据源,但是由于这是一个配置类,这初始化之后,在调用该配置类中的方法,都是去IOC容器中获取已经初始化的bean,不会再创建一个新的

202203062035281504.png

创建UserDao类

202203062035297295.png

创建UserService类

202203062035309846.png

添加包扫描:

202203062035323437.png

实现测试代码

202203062035333848.png

如果在进行sql操作的时候报错,它还是会修改数据库,不会进行事务的回滚

202203062035379719.png

事务回滚注解。

使用@Transactional表示当前方法是一个事务方法

2022030620353957310.png

然后在加上@EnableTransactionManagement,开启基于注解的事务管理功能

2022030620354082711.png

然后在配置类中将注册事务管理器加入到容器中

2022030620354281612.png

运行之后就能实现回滚。

现在我们分析@EnableTransactionManagement的底层实现

2022030620354407613.png

看到@Import传入的组件

2022030620354494814.png

同理研究TransactionManageConfigurationSelector

2022030620354696215.png

我们回看EnableTransactionManagement,它默认模式是PROXY

2022030620354890116.png

因此它会给返回两个组件

AutoProxyRegistrar、ProxyTransactionManagementConfiguration

2022030620355095517.png

AutoProxyRegistrar:对bean进行注册--》给容器中注册一个InfrastructureAdvisorAutoProxyCreator组件

2022030620355265018.png

它是利用后置处理器机制在对象创建以后,包装对象,返回一个代理对象(增强器),代理对象执行方法利用拦截器链进行处理调用。

2022030620355437819.png

ProxyTransactionManagementConfiguration

2022030620355632520.png

阅读全文