下面的方法插入两个记录(但此时不提交它们),然后尝试从前面的语句中读取一个未提交的记录。我用事务包装了代码,并将isolationLevel设置为"READ_COMMITTED“,但这似乎行不通。read/"SELECT“语句正在读取未提交的记录。
这怎麽可能?我哪里出问题了?请看下面的代码,帮我解决问题。我真的很感激~
注:
我正在使用BoneCP来获取DataSource。dbConnectionPool.initConnectionPool(dbName),将取一个BoneCPDataSource。
@Override void testDBCalls() { definition.setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED);dataSource DataSource = dBConnectionPool.getDataSource("titans");DefaultTransactionDefinition定义=新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 );尝试{ jdbcTemplate JdbcTemplate =新的JdbcTemplate(dataSource);String sql =“插入地下水(external_id,source_type )值(12,13);";jdbcTemplate.update(sql);System.out.println(”成功插入- 1");字符串sql2 =“插入地下水(external_id,source_type)值(123,45);”jdbcTemplate.update(sql2);System.out.println(“成功插入- 2");String sql3 =”从地下水中选择external_id= 123;";System.out.println(“结果:"+jdbcTemplate.queryForInt(sql3));txManager.commit(transactionStatus);System.out.println(”完成交易.“);} catch (异常e) { e.printStackTrace();txManager.rollback(transactionStatus);System.out.println(“回滚事务”);}}最后{ dataSource.getConnection().close();System.out.println(“关闭连接.”);} catch (SQLException e) { e.printStackTrace();}}
发布于 2016-08-10 09:09:24
正如@M.Denium在评论中解释的那样,我试图从单个事务中完成所有事情。隔离级别是为了保持不同事务之间的一致性。我还在学习这些概念,所以我把它看错了。
https://stackoverflow.com/questions/38553615
复制相似问题