日期:2014-05-20  浏览次数:20677 次

spring 声明式事务管理问题
<aop:config>
<aop:pointcut id="jdbcServiceMethod"
expression="within(org.aloha.bookstore.dao.impl..*)" />
<aop:advisor pointcut-ref="jdbcServiceMethod"
advice-ref="jdbcTxAdvice" />
</aop:config>
<tx:advice id="jdbcTxAdvice"
transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="add*" rollback-for="Exception" />
</tx:attributes>
</tx:advice>
这是我的事务配置下面是ACTION封装好对象后调用SERVICE的保存方法,而SERVICE层又会依赖DAO层我的事务声明范围就是在DAO包下面的
stockService.addStock(stock);
stockService.addStorage(storage);
stockService.addBook(book);
我想同时插入三张表但是这个事务好像不起作用。我用一个错误的数据插入
但是插入了两张表,而不是回滚事务,一张表没有插入成功

------解决方案--------------------
事务是对Service层有效,
就是说
如果你的Action分别调用Service的不同方法,每一次调用就是一次事务。
所以你的调用时进行了三次事务。
你应该把三次调用放在Service里面进行。然后Action一次调用Service的方法。这样是一次事务,如果三个调用有一个失败就会回滚。
------解决方案--------------------
数据库操作肯定是都放在dao里,但是那只是单纯的数据库操作而已,没有业务可言
比如某个业务要往两个表同时插入数据,如果其中一个出错,就回滚
那么这个事务肯定是在service层,你在dao层的事务表示你开启了两个完全独立的事务

所以你要把事务建立在业务层,让业务层中的dao方法,都在一个事务中,

只需要
stockService.addMethod(stock,storage,book);
然后在service中的addMethod方法中加入类似
stockDao.addStock(stock);
stockDao.addStorage(storage);
stockDao.addBook(book); 
最后更改事务配制
expression="within(org.aloha.bookstore.service.impl..*)" />