spring 声明式事务管理问题

autonomy 2008-07-23 08:22:56
<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);
我想同时插入三张表但是这个事务好像不起作用。我用一个错误的数据插入
但是插入了两张表,而不是回滚事务,一张表没有插入成功
...全文
114 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
autonomy 2008-07-24
  • 打赏
  • 举报
回复
终于解决了,谢谢Landor2004 SERVICE不是放在DAOLim
我的SERVICE.IMP包名写错了(SERVICEIMPL)
Landor2004 2008-07-23
  • 打赏
  • 举报
回复
expression="within(org.aloha.bookstore.dao.impl..*)" />

你的service类也在org.aloha.bookstore.dao.impl包里??
mikesu 2008-07-23
  • 打赏
  • 举报
回复
事务是对Service层有效,
就是说
如果你的Action分别调用Service的不同方法,每一次调用就是一次事务。
所以你的调用时进行了三次事务。
你应该把三次调用放在Service里面进行。然后Action一次调用Service的方法。这样是一次事务,如果三个调用有一个失败就会回滚。
zxp123456789 2008-07-23
  • 打赏
  • 举报
回复
http://bbs.langsin.com/index.php?fromuid=11313
autonomy 2008-07-23
  • 打赏
  • 举报
回复
我现在按照你写的做了,还是不能回滚啊!
zhuzy2004 2008-07-23
  • 打赏
  • 举报
回复
事务应该针对services方法,这样可以避免一个service方法部分执行
autonomy 2008-07-23
  • 打赏
  • 举报
回复
上面是我改了以后的内容,但还是不行
<tx:method name="add*" propagation="REQUIRED"/>这里加了事务行为
autonomy 2008-07-23
  • 打赏
  • 举报
回复
哪位大哥帮我看看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

Landor2004 2008-07-23
  • 打赏
  • 举报
回复
数据库操作肯定是都放在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..*)" />
autonomy 2008-07-23
  • 打赏
  • 举报
回复
mikesu 你说的有道理,我感觉应该在USERDAO里面来写个方法把这三个
操作放一块吧,因为数据操作都放到DAO里面了

67,516

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧