首页
App
&
Coffee
文档
项目
分享
反馈
俱乐部
登录
注册
jfinal多源数据库事务问题
穿越123
2017-09-28 10:04
在
jfinal
项目中使用多源数据库,在
service
层使用
Tx
.
class
,主数据库事物会回滚,但是从数据库事物不起作用,这是怎么回事,要怎么解决
项目:
JFinal
1
评论区
杜福忠
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指定是什么?表名?
回复
发送
我要反馈
热门反馈
扫码入社
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
}
});