至急的一个问题,关于spring3.12+ mybatis的事物控制

遇到一个很急的问题,我用的是声明式事务。
样式参照论坛的涛ge的代码,有这样一个需求,比如在下面的代码中,假如save方法中的
如果address 是 aaaa,那么要求事物强制回滚掉,这个地方该怎么解决啊

package cn.javass.spring.chapter9.service.impl;
//省略import
public class AnnotationUserServiceImpl implements IUserService {
...
    @Transactional(propagation=Propagation.REQUIRED, isolation=Isolation.READ_COMMITTED)
    @Override
    public void save(final UserModel user) {
        userDao.save(user);
        if ("aaaa".equals(user.getAddress())){
         // 事物要求回滚
            这个地方的代码怎么写?,如何将事物强制回滚掉?
         }
        addressService.save(user.getAddress());

    }
  
}

4个回答

// 事物要求回滚
这个地方的代码怎么写?,如何将事物强制回滚掉?

throw new RuntimeException即可。 如果mysql保证不是myisam引擎

dunkbird
dunkbird 最后还是用的抛异常。 有时间再研究status.setRollback()
大约 7 年之前 回复
jinnianshilongnian
jinnianshilongnian status.setRollback() ,怎么来进行具体操作。 spring会自动回滚 @Async 注解在service上也是可以的 它采用的是线程池 比如 http://jackyrong.iteye.com/blog/1728306 开线程也行
大约 7 年之前 回复
dunkbird
dunkbird 你的事物帖子我以前就看了,但是还是没有看出事务模板 自己控制事务 只要调用status.setRollback() ,怎么来进行具体操作。 spring 异步 @Async 是servlet3.0 以后的,是不是tomcat7才行的。另外,这个异步只是后台多线程,不能立即返回,只是并行处理。我记得是这样的,也就是 @Async 标识的处理超过30秒,那么 执行的servlet要超过30秒。我要的是立即返回,我现在是前段用的ajax轮询来判定 后台线程有没有结束,或者异常。 后台线程是用db来控制,如果正常,就会更新db里一个值,来判断后台线程状况。 目前这个异步没有问题。
大约 7 年之前 回复
jinnianshilongnian
jinnianshilongnian http://jinnianshilongnian.iteye.com/blog/1441271 spring 异步 http://www.cnblogs.com/clarkapp/archive/2012/10/16/2726963.html
大约 7 年之前 回复
dunkbird
dunkbird 事物模板是怎么用?我第一次听说,能详细说明下么? 用多线程的目地就是 把处理放到后台去进行,不然会有apache 的30秒的问题,主要是为了异步处理。 不然我不知道怎么在spring 里做异步处理。
大约 7 年之前 回复
jinnianshilongnian
jinnianshilongnian 使用事务模板吧 自己控制事务 只要调用status.setRollback()即可标识回滚 所以必须用多线程:你的意思是主线程启动从线程? 从线程抛异常回滚主线程的?
大约 7 年之前 回复
dunkbird
dunkbird 是INNODB的,抛出异常我想到了,但是我是在多线程中调用的service,因为有appache + tomcat客户的 appache 是放到云上的,有些处理会超过30秒,比如我的这个是上传大量的EXCEL文件,中途有数据不对,就要全都回滚。所以必须用多线程,不然apache会中断。 所以我想知道有没有不抛出异常,直接拿到事务的句柄的写法,进行当前事务的强制回滚。
大约 7 年之前 回复

public void save(final UserModel user) {

    if (!"aaaa".equals(user.getAddress())){
         userDao.save(user);
         addressService.save(user.getAddress());
     }


} 
weixin_42650982
PinkTaurus 干净、干脆
大约 7 年之前 回复
sweat89
sweat89 噗,,我也是这样觉得,save之前判断一下不就好了吗
大约 7 年之前 回复
jixian3204
jixian3204 或者你抛出个异常!
大约 7 年之前 回复

[code="java"]
@Transactional(propagation=Propagation.REQUIRED, isolation=Isolation.READ_COMMITTED,[b][i]rollbackFor = Exception.class[/i][/b])
@Override
public void save(final UserModel user) {
userDao.save(user);
if ("aaaa".equals(user.getAddress())){
[b][i]throw new Exception("XXXX");[/i][/b]
}
addressService.save(user.getAddress());

} 

[/code]

可以直接throw一个异常。。这样就rollback事务了。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问