Spring 事务不工作 - JDBCTemplate 正在读取未提交的数据
Spring Transactions not working - JDBCTemplate is reading uncommitted data
以下方法插入两条记录(但此时不提交它们),然后尝试从前面的语句中读取一条未提交的记录。我用 Transaction 包装了代码,并将 isolationLevel 设置为 "READ_COMMITTED" 但这似乎不起作用。 read/"SELECT" 语句正在读取未提交的记录。
这怎么可能?我哪里错了?请查看下面的代码并帮助我。非常感谢~
注:
我正在使用 BoneCP 来获取数据源。
dbConnectionPool.initConnectionPool(dbName) ,将获取 BoneCPDataSource.
@Override public void testDBCalls() {
dBConnectionPool.initConnectionPool("titans");
DataSource dataSource = dBConnectionPool.getDataSource("titans");
DefaultTransactionDefinition definition = new DefaultTransactionDefinition();
definition.setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED);
definition.setIsolationLevel(TransactionDefinition.ISOLATION_REPEATABLE_READ);
definition.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
DataSourceTransactionManager txManager = new DataSourceTransactionManager(dataSource); TransactionStatus
transactionStatus = txManager.getTransaction(definition);
try {
try {
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
String sql = "INSERT INTO groundwater(external_id,source_type) VALUES (12, 13);";
jdbcTemplate.update(sql);
System.out.println("Successfully inserted - 1");
String sql2 = "INSERT INTO groundwater(external_id, source_type,) VALUES(123,45);";
jdbcTemplate.update(sql2);
System.out.println("Successfully inserted - 2");
String sql3 = "select gw_id from groundwater where external_id= 123;";
System.out.println("Result : "+jdbcTemplate.queryForInt(sql3));
txManager.commit(transactionStatus);
System.out.println("Commiting the trasaction...");
} catch (Exception e) {
e.printStackTrace();
txManager.rollback(transactionStatus);
System.out.println("Rolling back the transaction");
}
} finally {
try {
dataSource.getConnection().close();
System.out.println("Closing the connection ...");
} catch (SQLException e) {
e.printStackTrace();
}
}
}
正如@M.Denium 在评论中解释的那样,我试图从一个事务中完成所有事情。隔离级别旨在保持不同事务之间的一致性。我还在学习概念,所以我理解错了。
以下方法插入两条记录(但此时不提交它们),然后尝试从前面的语句中读取一条未提交的记录。我用 Transaction 包装了代码,并将 isolationLevel 设置为 "READ_COMMITTED" 但这似乎不起作用。 read/"SELECT" 语句正在读取未提交的记录。
这怎么可能?我哪里错了?请查看下面的代码并帮助我。非常感谢~
注:
我正在使用 BoneCP 来获取数据源。
dbConnectionPool.initConnectionPool(dbName) ,将获取 BoneCPDataSource.
@Override public void testDBCalls() { dBConnectionPool.initConnectionPool("titans"); DataSource dataSource = dBConnectionPool.getDataSource("titans"); DefaultTransactionDefinition definition = new DefaultTransactionDefinition(); definition.setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED); definition.setIsolationLevel(TransactionDefinition.ISOLATION_REPEATABLE_READ); definition.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED); DataSourceTransactionManager txManager = new DataSourceTransactionManager(dataSource); TransactionStatus transactionStatus = txManager.getTransaction(definition); try { try { JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); String sql = "INSERT INTO groundwater(external_id,source_type) VALUES (12, 13);"; jdbcTemplate.update(sql); System.out.println("Successfully inserted - 1"); String sql2 = "INSERT INTO groundwater(external_id, source_type,) VALUES(123,45);"; jdbcTemplate.update(sql2); System.out.println("Successfully inserted - 2"); String sql3 = "select gw_id from groundwater where external_id= 123;"; System.out.println("Result : "+jdbcTemplate.queryForInt(sql3)); txManager.commit(transactionStatus); System.out.println("Commiting the trasaction..."); } catch (Exception e) { e.printStackTrace(); txManager.rollback(transactionStatus); System.out.println("Rolling back the transaction"); } } finally { try { dataSource.getConnection().close(); System.out.println("Closing the connection ..."); } catch (SQLException e) { e.printStackTrace(); } } }
正如@M.Denium 在评论中解释的那样,我试图从一个事务中完成所有事情。隔离级别旨在保持不同事务之间的一致性。我还在学习概念,所以我理解错了。