Aspectj模式下关于service嵌套调用事务创建以及回滚的问题?
(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
service中addStudent方法中首先是添加数据,然后修改这个添加后的数据的class,然后调用自身的updateStudent方法更新。
(3)dao
(4)main
以上代码是项目抽象出来的,测试时发现存在一些问题,主要问题如下
程序的分析
(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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论