gpt4 book ai didi

java - 如何让 Spring JdbcTemplate 处于 read_uncommissed 状态?

转载 作者:太空宇宙 更新时间:2023-11-04 08:08:23 26 4
gpt4 key购买 nike

首先,我不能使用声明性的 @Transactional 方法,因为应用程序有多个 JDBC 数据源,我不想厌倦细节,但只要说 DAO 方法传递了正确的数据源来执行逻辑就足够了。所有 JDBC 数据源都具有相同的架构,当我为 ERP 系统公开其余服务时,它们是分开的。

由于这个遗留系统有很多我无法控制的长期锁定记录,所以我想要脏读。

使用 JDBC 我将执行以下操作:

private Customer getCustomer(DataSource ds, String id) {
Customer c = null;
PreparedStatement stmt = null;
Connection con = null;
try {
con = ds.getConnection();
con.setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED);
stmt = con.prepareStatement(SELECT_CUSTOMER);
stmt.setString(1, id);
ResultSet res = stmt.executeQuery();
c = buildCustomer(res);
} catch (SQLException ex) {
// log errors
} finally {
// Close resources
}
return c;
}

好吧,我知道有很多样板。因此,自从我使用 spring 以来,我尝试了 JdbcTemplate

使用JdbcTemplate

private Customer getCustomer(JdbcTemplate t, String id) {
return t.queryForObject(SELECT_CUSTOMER, new CustomerRowMapper(), id);
}

好多了,但它仍然使用默认的事务隔离。我需要以某种方式改变这一点。所以我考虑使用 TransactionTemplate

private Customer getCustomer(final TransactionTemplate tt,
final JdbcTemplate t,
final String id) {
return tt.execute(new TransactionCallback<Customer>() {
@Override
public Customer doInTransaction(TransactionStatus ts) {
return t.queryForObject(SELECT_CUSTOMER, new CustomerRowMapper(), id);
}
});
}

但是这里如何设置事务隔离呢?我在回调或 TransactionTemplate 中找不到执行此操作的任何位置。

我正在阅读《Spring in Action,第三版》,它就我所做的进行了解释,尽管有关事务的章节继续使用带有注释的声明性事务,但正如前面提到的,我不能使用它,因为我的 DAO 需要在运行时根据提供的参数确定要使用哪个数据源,在我的例子中是国家/地区代码。

任何帮助将不胜感激。

最佳答案

我目前已经通过直接使用DataSourceTransactionManager解决了这个问题,尽管看起来我并没有像我最初希望的那样节省那么多的样板文件。不要误会我的意思,它更干净,尽管我仍然忍不住觉得必须有一种更简单的方法。我不需要读取事务,我只想设置隔离。

private Customer getCustomer(final DataSourceTransactionManager txMan,
final JdbcTemplate t,
final String id) {
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
def.setIsolationLevel(TransactionDefinition.ISOLATION_READ_UNCOMMITTED);

TransactionStatus status = txMan.getTransaction(def);
Customer c = null;
try {
c = t.queryForObject(SELECT_CUSTOMER, new CustomerRowMapper(), id);
} catch (Exception ex) {
txMan.rollback(status);
throw ex;
}
txMan.commit(status);
return c;
}

我仍然会暂时不回答这个问题,因为我坚信一定有更好的方法。

引用Spring 3.1.x Documentation - Chapter 11 - Transaction Management

关于java - 如何让 Spring JdbcTemplate 处于 read_uncommissed 状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11681713/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com