java—如何在spring框架启动事务时发出指定的sql

czq61nw1  于 2021-07-24  发布在  Java
关注(0)|答案(0)|浏览(250)

我正在用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 ?

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题