spring 声明式事务治理问题

时间:2008-07-24 08:24:21   来源:论坛整理  作者:  编辑:chinaitzhe
<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);
我想同时插入三张表但是这个事务似乎不起作用。我用一个错误的数据插入
但是插入了两张表,而不是回滚事务,一张表没有插入成功
网友回复:此回复为自动发出,仅用于显示而已,并无任何其他非凡作用
楼主【autonomy】截止到2008-07-23 08:23:00的历史汇总数据(不包括此帖):
发帖的总数量:22 发帖的总分数:880 每贴平均分数:40
回帖的总数量:20 得分贴总数量:0 回帖的得分率:0%
结贴的总数量:15 结贴的总分数:540
无满足结贴数:7 无满足结贴分:280
未结的帖子数:7 未结的总分数:340
结贴的百分比:68.18 % 结分的百分比:61.36 %
无满足结贴率:46.67 % 无满足结分率:51.85 %
楼主加油
网友回复:该回复于2008-07-23 13:57:12被版主删除
网友回复:事务应该针对services方法,这样可以避免一个service方法部分执行
网友回复:http://bbs.langsin.com/index.php?fromuid=11313
网友回复:事务是对Service层有效,
就是说
假如你的Action分别调用Service的不同方法,每一次调用就是一次事务。
所以你的调用时进行了三次事务。
你应该把三次调用放在Service里面进行。然后Action一次调用Service的方法。这样是一次事务,假如三个调用有一个失败就会回滚。
网友回复:mikesu 你说的有道理,我感觉应该在USERDAO里面来写个方法把这三个
操作放一块吧,因为数据操作都放到DAO里面了
网友回复:数据库操作肯定是都放在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..*)" />
网友回复:哪位大哥帮我看看SPRING HIBERNATE事务不起作用的问题
下面是配置文件
<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*" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
action:
stockService.addStock(stock,storage,book);
service:
stockdao.addStock(stock,storage,book);
stockdao:

public void addStock(Stock stock ,Storage storage,Book book) throws Exception {
Session session = null;

session = getSession();
session.save(stock);
session.save(storage);
session.save(book);
//session.flush();
session.close();

}
其中STOCKSERVICE和STOCKDAO分别实现接口ISTOCKSERVICE,ISTOCKDAO


网友回复:上面是我改了以后的内容,但还是不行
<tx:method name="add*" propagation="REQUIRED"/>这里加了事务行为
网友回复:我现在按照你写的做了,还是不能回滚啊!
网友回复:expression="within(org.aloha.bookstore.dao.impl..*)" />

你的service类也在org.aloha.bookstore.dao.impl包里??
网友回复:终于解决了,谢谢Landor2004 SERVICE不是放在DAOLim
我的SERVICE.IMP包名写错了(SERVICEIMPL)
关键字:spring,声明,事务,治理,问题,

文章评论

共有 0 位网友发表了评论 此处只显示部分留言 点击查看完整评论页面