我正在用spring框架和mybatis开发一个java应用程序( mybatis-spring
). 在我的应用程序中,我为每个用户使用分离的rdbms模式。您可以使用sql来切换架构 SET SESSION AUTHORIZATION
在业务逻辑中。
在一些关系数据库中, SET SESSION AUTHORIZATION
只能作为第一条语句发出(例如ibmdb2),或在事务启动之前发出(例如hitachi hirdb)
所以我想发布 SET SESSION AUTHORIZATION
就在spring框架开始事务之前/之后。请注意,我正在使用 @Transactional
用于控制事务的注解。
我找到了 TransactionSynchronization
拥有 beforeCommit()
在事务提交之前运行一些逻辑,但是现在运行已经太迟了 SET SESSION AUTHORIZATION
.
示例
例如,如果您有以下代码,
当您发送请求时 /postA
,您应该发布 SET SESSION AUTHORIZATION
在(a)上。
当您发送请求时 /postB
,您应该发布 SET SESSION AUTHORIZATION
在(b)上,但不应在(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框架启动事务时运行一些逻辑 SET SESSION AUTHORIZATION
?
暂无答案!
目前还没有任何答案,快来回答吧!