Db和Model写在同一个事务中是不是会被隔离开的?

我遇到的情景描述如下:

1、在自己的Service类中定义了一个方法m1(),并且用@Before(Tx.class)进行了注解,如下:

public Class ContractAccountService {

public String customerId;

public ContractAccountService() {}

public ContractAccountService(String customerId) {
    this.customerId = customerId;
}

@Before(Tx.class)
public void m1() {
    String ids = "";
    for (int i = 0; i < 10; i++) {
          CustomerAccount acc = new CustomerAccount();
          acc.set("id", i);
          acc.save();
          ids += "," + i
    }
    Db.update(" update customer_account t set t.account_type='personal' where t.id in (?) ", ids);
}

}

2、在controller中调用m1(),如下:

public Class MyController {
    public void test() {
        ContractAccountService service = Enhancer
            .enhance(new ContractAccountService("JSIWOOSOW*K@"));
        service.m1();
    }
}

3、m1方法中先调用了Model.save()保存了若干数据,然后调用了Db.update()方法用来更新前面保存的若干数据,但是发现Db.update()方法并没有生效。确切的说,是Db.update()执行的返回值是0 。


评论区

JFinal

2018-08-27 21:53

代码缺失,注意在编辑时,可以点击文本编译器上的代码下拉按钮,可以直接写代码,不会丢失

在这里可以继续编辑该文章:
http://www.jfinal.com/my/feedback

注意点击右侧的编辑链接

jianghe727

2018-08-28 09:25

@JFinal 已经重新进行了编辑

JFinal

2018-08-28 11:00

@jianghe727 这个是因为你前面的 acc.save() 与 后面的 Db.update 处在一个事务之中,事务未提交所以 acc.save() 还并未真正在数据库里面创建记录,所以后面的 Db.update 找不到 ids 参数,所以就不会生效了

解决办法是不要将 acc.save 与 Db.update 放在同一个事务中,具体做法是使用 Db.tx(...) 这种手动的方式对 acc.save() 部分做事务

然后 Db.update 另起一个事务

这个问题本质是因为 Db.update 中使用的 where 条件对于同一个事务中前面的 acc.save() 有依赖,并不是在 jfinal 中才会碰到的问题,使用任何一个 ORM 框架都会碰到这个问题

凉茶冰

2018-09-10 11:47

@JFinal 貌似不是波总说的这样啊。。我说下我情况,请波总指导!
我再Controller中,使用enhance加强,然后访问servier中使用@Before(Tx.class)注解的方法,方法中的代码很简单。
就是一个for循环,往表里新增10条记录,然后再Db.update.
@Before(Tx.class)
public void step1(){
for(int i=0;i<10;i++){
KnUserAssist.GetInstance()
.set("u_id",i)
.set("record_id","内容")
.set("update_time",new Date())
.save();
}
Db.update("update kn_user_assist set record_id='被修改' where u_id='2'");
}
其中kn_user_assist表主键自增。执行完之后,我查询数据库中,u_id=2的记录的record_id内容是“被修改”。
Jfinal版本用的2.2 。

热门反馈

扫码入社