问题描述
我正在使用 Spring Framework 和 MyBatis (mybatis-spring
) 开发 Java 应用程序。
在我的应用程序中,我为每个用户使用单独的 RDBMS 模式。您可以在业务逻辑中使用 sql SET SESSION AUTHORIZATION
切换架构。
在某些 RDBMS 中,SET SESSION AUTHORIZATION
只能作为第一条语句发出(例如 IBM Db2),或者在事务开始之前发出(例如 Hitachi HiRDB)
所以我想在 Spring Framework 开始事务之前/之后发出 SET SESSION AUTHORIZATION
。
请注意,我使用 @Transactional
注释来控制事务。
我发现 TransactionSynchronization
类具有 beforeCommit()
以在事务提交之前运行一些逻辑,但现在运行 SET SESSION AUTHORIZATION
为时已晚。
示例
例如,如果您有以下代码,
- 当您在
/postA
上发送请求时,您应该在 (A) 上发出SET SESSION AUTHORIZATION
。 - 当您在
/postB
上发送请求时,您应该在 (B) 上发出SET SESSION AUTHORIZATION
,但不应在 (A) 上发出它。
像 @pointcut("within(@org.springframework.transaction.annotation.Transactional *)")
这样的简单注释不适用于此要求,因为它无法区分上述两种情况。
public class TestController {
@Autowired
TestServiceA serviceA;
@Autowired
TestServiceB serviceB;
@PostMapping("/postA")
public void postA() {
serviceA.insertA();
}
@PostMapping("/postB")
public void postB() {
serviceB.insertB();
}
}
@Service
public class TestServiceA {
@Autowired
ItemDao itemDao;
@Transactional(propagation=Propagation.required)
public void insertA() {
// (A)
itemDao.insert(someItem);
}
}
@Service
public class TestServiceB {
@Autowired
ItemDao itemDao;
@Autowired
TestServiceA serviceA;
@Transactional(propagation=Propagation.required)
public void insertB() {
// (B)
serviceA.insertA();
itemDao.insert(someItem);
}
}
问题
如何在 Spring Framework 启动事务时运行一些逻辑以发出 SET SESSION AUTHORIZATION
?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)