Spring框架启动事务时如何发出指定的SQL 示例问题

问题描述

我正在使用 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 (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...