Spring 中的交易和物理连接

Transaction and Physical Connection in Spring

当使用 Spring jdbcTemplate 时没有 @Transactional 注释并且数据源自动提交 属性 设置为 true。

每个 SQL 语句都在它自己的事务中,但是这些单独的事务会在同一个物理连接中吗?


在下面的代码片段中(使用@Transactional),所有三个 SQL 语句将在同一个 connection/transaction.

@Transactional
public void test() {

    jdbcTemplate.batchUpdate("INSERT INTO TB_MYTEST(MYKEY, MYVALUE) VALUES ('start', 'start')");
    jdbcTemplate.batchUpdate("INSERT INTO TB_MYTEST(MYKEY, MYVALUE) VALUES ('hi', 'hi')");
    jdbcTemplate.batchUpdate("INSERT INTO TB_MYTEST(MYKEY, MYVALUE) VALUES ('end', 'end')");

}

但在下面的代码片段中(没有@Transactional),每个 SQL 语句将在单独的事务中。

连接怎么样?所有这三个单独的事务是否都在同一个物理连接中,或者 Spring 每个事务都会从 dataSource 获得三个不同的连接?

public void test() {

    jdbcTemplate.batchUpdate("INSERT INTO TB_MYTEST(MYKEY, MYVALUE) VALUES ('start', 'start')");
    jdbcTemplate.batchUpdate("INSERT INTO TB_MYTEST(MYKEY, MYVALUE) VALUES ('hi', 'hi')");
    jdbcTemplate.batchUpdate("INSERT INTO TB_MYTEST(MYKEY, MYVALUE) VALUES ('end', 'end')");

}

有什么方法可以检查两个事务是否在同一个物理连接中?

感谢回复!

可能使用相同的连接每个数据库连接绑定到spring中的一个线程或一个事务。如果没有连接绑定到 thread/transaction 那么它将从连接池中获取一个新连接。

TransactionSynchronizationManager class 在 DataSource 的帮助下管理数据库连接。

当您使用 Transaction 时,可以保证它将使用相同的数据库连接,而如果您 运行 SQL 查询没有事务,那么它可能会也可能不会使用相同的数据库连接取决于连接池中的连接可用性。