jfinal多源数据库事务问题

  1. jfinal项目中使用多源数据库,在service层使用Tx.class,主数据库事物会回滚,但是从数据库事物不起作用,这是怎么回事,要怎么解决


评论区

杜福忠

2017-09-28 20:17

方式1:
Db.use(configName_A).tx(new IAtom() {
@Override
public boolean run() throws SQLException {
// 数据库A 操作 ....
// 操作完后 再操作 其他的 库
Db.use(configName_B).tx(new IAtom() {
@Override
public boolean run() throws SQLException {
// 数据库B 操作 ....
return true; // 不回滚返回true , 回滚返回 false
}
});
return true; // 不回滚返回true , 回滚返回 false
}
});

杜福忠

2017-09-28 20:45

第二种方式:
public class MyService {

public static MyService me = Duang.duang(MyService.class);

@TxConfig("configName_A")
@Before(Tx.class)
public void operationA() {
// 数据库A 操作 ....
// 操作完后 再操作 其他的 库
me.operationB();
// 再操作 其他的..
}

@TxConfig("configName_B")
@Before(Tx.class)
public void operationB() {
// 数据库B 操作 ....
}

}

JFinal

2017-09-28 21:59

Tx 拦截器以及 Db.tx(...) 方法默认是支持主数据源上的事务,如果要支持“非主数据源”上的事务,需要 TxConfig 注解配合 Tx 拦截器,或者 Db.use(...).tx(...) 来实现

以上也只是让各数据源处在多个事务中,而不能是一个事务中,让多数据源处于同一个事务中,这属于分布式事务的范畴,jfinal 目前暂不支持

跨数据源的分布式事务,实现起来代码比较难看,对性能也会有一定影响,所以 jfinal 暂时不支持这个特性

跨数据源的事务,建议将业务拆分成多个步骤来做,而每个步骤处于单个事务中

穿越123

2017-09-29 09:13

@JFinal 这个问题我已经解决了,使用的是TxConfig ,谢谢波总

黄小疯

2019-04-11 12:46

@JFinal @TxConfig("configName_A")中的configName_A指定是什么?表名?

热门反馈

扫码入社