Aspectj模式下关于service嵌套调用事务创建以及回滚的问题?

发布于 2022-09-12 01:03:31 字数 2649 浏览 18 评论 0

(1)Spring xml配置文件

  
<context:property-placeholder location\="classpath:jdbc.properties"/>  
<context:component-scan base-package\="sachin.com.transactional"\></context:component-scan\>  
  
<!-- 注册数据源 C3P0 -->  
<bean id\="dataSource" class\="com.mchange.v2.c3p0.ComboPooledDataSource" \>  
    <property name\="driverClass" value\="${jdbc.driverClass}"\></property\>  
    <property name\="jdbcUrl" value\="${jdbc.url}"\></property\>  
    <property name\="user" value\="${jdbc.username}"\></property\>  
    <property name\="password" value\="${jdbc.password}"\></property\>  
</bean\>  
  
<bean id\="studentDao" class\="sachin.com.transactional.dao.StudentDao"\>  
    <property name\="dataSource" ref\="dataSource"\></property\>  
  
</bean\>  
<bean id\="transactionManager" class\="org.springframework.jdbc.datasource.DataSourceTransactionManager"\>  
    <property name\="dataSource" ref\="dataSource"\></property\>  
</bean\>  
<tx:annotation-driven transaction-manager\="transactionManager" mode\="aspectj"\></tx:annotation-driven\>

主要是配置数据源 transactionManager .
其中关键一句是 <tx:annotation-driven transaction-manager="transactionManager" mode="aspectj"></tx:annotation-driven>

指定了mode为aspectj,默认mode是proxy
(2)serivice
image.png

service中addStudent方法中首先是添加数据,然后修改这个添加后的数据的class,然后调用自身的updateStudent方法更新。

(3)dao
image.png

(4)main
image.png

以上代码是项目抽象出来的,测试时发现存在一些问题,主要问题如下

程序的分析
(1)main中创建实体Student然后调用StudentService的addStudent方法。
(2)StudentService使用了Transactional注解,并配置事务的传播属性是requires-New,同时因为tx:annotation-driven 配置mode为aspectj,因此不管是使用StudentService调用其方法,还是自身的嵌套调用(比如addStudent调用updateStudent)每一个方法都会创建一个新的事务。(问题1:这个分析有问题吗?)
(3)main中调用addStudent,因此addStudent创建新事务,
addStudent调用了update方法因此updateStudent也会创建新事务。
updateStudent方法中update数据然后抛出RuntimeException,则updateStudent所在的事务回滚。但是因为addStudent中捕获了 异常,所以addStudent事务正常提交。
最终数据库中得到的数据是插入成功,更新失败的数据。
但是实际运行分析却发现插入成功并且更细成功。(这个是问题2)

(4)设置项目的日志输出级别是debug,查看日志发现addStudent updateStudent 没有创建事务 提交事务回滚事务等事务相关的日志。仅有获取connection,executesql,returnconnection等日志。而且addStudent 和updateStudent 使用的数据库connection不同,日志显示是分别获取的connection,没有共用connection。

因为没有事务相关的日志,因此猜测可能是配置出现了问题导致事务没有开启,事务没开启就可以解释问题2。 但是问题3就是 为什么事务没有开启? addStudent为什么没有创建事务?

不晓得我有没有解释清楚,麻烦各位前辈帮忙解释一下问题出哪了

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文