0

我正在使用 Derby 数据库并尝试同时创建数据库对象。

众所周知,其中默认的隔离级别是TRANSACTION_READ_COMMITTED。

但我不想让 DB 进行幻读,因此,我想将隔离级别设置为 TRANSACTION_SERIALIZABLE。

我所做的就是这段代码。

if(jdbcTemplate.getDataSource().getConnection().getTransactionIsolation() == Connection.TRANSACTION_READ_COMMITTED) {
                logger.info("The connection isolation is already TRANSACTION_READ_COMMITTED");
            }
            else {
                logger.info("Please set the connection isolation to TRANSACTION_READ_COMMITTED");
            }

            jdbcTemplate.getDataSource().getConnection().setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);
            if(jdbcTemplate.getDataSource().getConnection().getTransactionIsolation() == Connection.TRANSACTION_SERIALIZABLE) {
                logger.info("The connection isolation is now TRANSACTION_SERIALIZABLE");
            }

正如预期的那样,我看到日志为"The connection isolation is already TRANSACTION_READ_COMMITTED",但令人惊讶的是我没有看到"The connection isolation is now TRANSACTION_SERIALIZABLE"的日志。

此外,我期待的异常也会发生,它确认隔离级别未设置为可序列化。

4

1 回答 1

0
 1 if(jdbcTemplate.getDataSource().getConnection().getTransactionIsolation() == Connection.TRANSACTION_READ_COMMITTED) {
 2                logger.info("The connection isolation is already TRANSACTION_READ_COMMITTED");
 3            }
 4            else {
 5                logger.info("Please set the connection isolation to TRANSACTION_READ_COMMITTED");
 6            }
 7
 8            jdbcTemplate.getDataSource().getConnection().setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);
 9            if(jdbcTemplate.getDataSource().getConnection().getTransactionIsolation() == Connection.TRANSACTION_SERIALIZABLE) {
10                logger.info("The connection isolation is now TRANSACTION_SERIALIZABLE");
11            }
12

我知道这是一个旧线程,但我偶然发现它并想提一下,据我了解,对 getConnection() @ 第 1、8、9 行的调用根本不引用相同的连接——所以有没有理由期望改变一个连接的隔离会改变后续连接的隔离。

相反,如果您实际上保留对连接的引用,然后在代码中使用它,您应该会看到预期的结果......

 0 Connection conn = jdbcTemplate.getDataSource().getConnection();
 1 if(conn.getTransactionIsolation() == Connection.TRANSACTION_READ_COMMITTED) {
 2                logger.info("The connection isolation is already TRANSACTION_READ_COMMITTED");
 3            }
 4            else {
 5                logger.info("Please set the connection isolation to TRANSACTION_READ_COMMITTED");
 6            }
 7
 8            conn.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);
 9            if(conn.getTransactionIsolation() == Connection.TRANSACTION_SERIALIZABLE) {
10                logger.info("The connection isolation is now TRANSACTION_SERIALIZABLE");
11            }
12
于 2018-11-13T09:55:29.453 回答