gpt4 book ai didi

java - 将 spring JDBC 事务与 hibernate 事务隔离

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:56:08 26 4
gpt4 key购买 nike

在 Spring ,HibernateTransactionManager 在创建新事务时使用初始化它的 SessionFactory 将 session “绑定(bind)”到当前线程上下文。然后,当使用 HibernateTemplate 时,它​​会找到绑定(bind)的 Session 并使用它。

但是我今天发现 HTM 还将其事务绑定(bind)到底层数据源以及 SessionFactory(如果可能)。这允许代码在事务范围内使用 JdbcTemplate,并且假设 JdbcTemplate 使用的数据源与 SessionFactory 使用的相同,Jdbc 操作将参与事务(使用相同的底层连接)。

今天,当我在我的 hibernate ID 分配器中有一些代码创建 DataSourceTransactionManager 和 JdbcTemplate 以从高低位表中分配 ID 时,这让我非常难受。我打算这是一个独立的事务,它将获取下一个高数字,然后将更改提交到 id 表。然而,由于上述行为,它实际上参与了我的“外部” hibernate 事务,更糟糕的是提前提交了它。可以说不好。

我尝试使用事务传播设置(使用 REQUIRES_NEW),但这没有帮助。

有谁知道在 hibernate 事务中使用 JdbcTemplate 并且不让它们共享事务的最佳方法,即使它们共享相同的数据源?

编辑:

我有一个 SessionFactory (S),它是由 spring LocalSessionFactoryBean 使用 DataSource (D) 创建的。 HibernateTransactionManager 是使用该 SessionFactory (S) 创建的。

一些业务逻辑代码看起来像这样..

hibernateTransactionOperations.execute( new TransactionCallbackWithoutResult()
{
@Override
protected void doInTransactionWithoutResult( TransactionStatus status )
{
// some transactional code here using a HibernateTemplate

// will include calls to id allocation when doing hibernateTemplate.save(obj)
}
} );

我的 id 分配就是这样做的(解释),下面的 DataSource 与 SessionFactory (S) 中使用的相同 (D)。

PlatformTransactionManager txManager = new DataSourceTransactionManager( dataSource );
TransactionOperations transactionOperations = new TransactionTemplate( txManager );

return transactionOperations.execute( new TransactionCallback<Long>()
{
public Long doInTransaction( TransactionStatus status )
{
return allocateBatchTxn( idKey, batchSize );
}
} );

当上面的 transactionOperations 执行完成时,它将提交底层事务,这似乎与“外部” hibernate 事务相同。我已经通过检查数据库中的锁/事务确认了这一点。

最佳答案

不要在您的 ID 分配代码中创建新的 DataSourceTransactionManager。而是使用 REQUIRES_NEW 和 HibernateTransactionManager

allocateBatchTxn() 中,获取 JDBC 连接的最安全方法是通过 Spring 的 DataSourceUtils.getConnection() 方法。

关于java - 将 spring JDBC 事务与 hibernate 事务隔离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4741710/

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