求救spring中事务重复提交问题

jmshtdxnbz 2010-12-06 04:21:05
首先,有action,service和dao,事务是在service中控制的,下面这些是在service中的方法

public void excuteUpdate()
throws BusinessException {

TransactionStatus status = LocBegin();
try {
doSomethingByDao();
} catch (BusinessException e) {
LocRollback(status);
throw e;
} catch (Exception e) {
this.LocRollback(status);
e.printStackTrace();
throw new BusinessException("000", "unexception!");
}
LocCommit(status);

}

public TransactionStatus LocBegin() throws BusinessException{//事务开始
try{
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
TransactionStatus status = transactionManager.getTransaction(def);
return status;
}catch(TransactionException e){
throw new BusinessException("100", e.getMessage());
}
}

public void LocCommit(TransactionStatus status) throws BusinessException{//事务提交
try{
transactionManager.commit(status);
}catch(TransactionException e){
transactionManager.rollback(status);
throw new BusinessException("101", e.getMessage());
}
}

public void LocRollback(TransactionStatus status) throws BusinessException{//事务回滚
try{
transactionManager.rollback(status);
}catch(TransactionException e){
throw new BusinessException("102", e.getMessage());
}
}


老是报这样的异常:
org.springframework.transaction.IllegalTransactionStateException: Transaction is already completed - do not call commit or rollback more than once per transaction
at org.springframework.transaction.support.AbstractPlatformTransactionManager.rollback(AbstractPlatformTransactionManager.java:551)
at org.dxs.service.UpdateService_Impl.LocCommit(Unknown Source)
说是事务已经提交了,想不明白,代码里就提交了这一次啊
...全文
1541 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
realman9527 2011-01-25
  • 打赏
  • 举报
回复
遇到相似这种问题,求答案。。。。。。
realman9527 2011-01-25
  • 打赏
  • 举报
回复
遇到这种情况
jmshtdxnbz 2010-12-07
  • 打赏
  • 举报
回复
弱弱的问下 service 和DAO 那个属于V层?
Transaction is already completed - do not call commit or rollback more than once per transaction
这是不是说重复提交 是事务重复了


两位都问到V层是指什么,不太明白啊,mvc中的V吗,jsp发的请求,action是用来接收并控制转向,service是处理业务逻辑的,dao是和数据库交换的,就这样啊
jmshtdxnbz 2010-12-07
  • 打赏
  • 举报
回复
#7楼 得分:0回复于:2010-12-07 09:23:24你在service层配置的事务 也就是说当service层发现异常时就会回滚
但是你在DAO数据库交互时已经将异常catch掉了 所以DAO异常时其实已经回滚了


在dao中catch到的异常最终也是以BusinessException的形式抛回到service中去了,然后再service中再抓到回滚的,回滚后再把异常抛给上一层的action,由action中配置的全局异常处理类来处理。
zn85600301 2010-12-07
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 zhuchao_ko 的回复:]

引用 2 楼 eswn 的回复:
doSomethingByDao这里,Spring执行事务.回调方法时已经含有try/catch了,这里如果出错,就会回滚,你在外面再回滚,就是第二次了,所以就出错了。


用try catch 异常来做这块操作不太好。

楼主V层是什么 如果是STRUTS的话都有相关的重复提交的办法 不要在SPRING里做这个

因为这本来就是V该做的事情。
……
[/Quote]

弱弱的问下 service 和DAO 那个属于V层?
Transaction is already completed - do not call commit or rollback more than once per transaction
这是不是说重复提交 是事务重复了
zn85600301 2010-12-07
  • 打赏
  • 举报
回复
你在service层配置的事务 也就是说当service层发现异常时就会回滚
但是你在DAO数据库交互时已经将异常catch掉了 所以DAO异常时其实已经回滚了
jmshtdxnbz 2010-12-07
  • 打赏
  • 举报
回复
我是维护一个旧的系统,生产环境中报错,我不好直接测试,也是看日志报了很多这样的错误。系统是用struts1+spring写的,基本的调用就是jsp提交请求到action层,action层调用service类,service类调用dao方法,所有的事务都是在service层次里的。
doSomethingByDao()中是就是下面这些
{
userDao.insertSomething(String args);
userDao.updateSomethingRyjfxzmx_fde(String args);
}

dao中
insertSomething(String args) throws BusinessException
{
try {
this.getJdbcTemplate().update(updateSql, args);
}
catch (DataAccessException e) {
throw new BusinessException(e.getMessage());
}
}

另外一个类似,基本情况就是这样了,显然没有提交过,配置文件里面也没见有自动提交的设置,三楼说的意思是不是在dao中的try块出错了就会自动回滚了。
mouhk 2010-12-07
  • 打赏
  • 举报
回复
我觉得可能是public TransactionStatus LocBegin()里的问题哦,你没有真正的开始一个事务。
朱超ZhuChao.Tech 2010-12-07
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 eswn 的回复:]
doSomethingByDao这里,Spring执行事务.回调方法时已经含有try/catch了,这里如果出错,就会回滚,你在外面再回滚,就是第二次了,所以就出错了。
[/Quote]

用try catch 异常来做这块操作不太好。

楼主V层是什么 如果是STRUTS的话都有相关的重复提交的办法 不要在SPRING里做这个

因为这本来就是V该做的事情。
coolbamboo2008 2010-12-07
  • 打赏
  • 举报
回复
同意2楼
eswn 2010-12-06
  • 打赏
  • 举报
回复
doSomethingByDao这里,Spring执行事务.回调方法时已经含有try/catch了,这里如果出错,就会回滚,你在外面再回滚,就是第二次了,所以就出错了。
lovebaylong 2010-12-06
  • 打赏
  • 举报
回复
doSomethingByDao();
是不是在这里已经提交事务了啊,或是设置了事务自动提交?

方法名都大写开头,汗一个。。。

81,122

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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