【问题标题】:How to set Transaction Isolation level for a single kodo query?如何为单个 kodo 查询设置事务隔离级别?
【发布时间】:2014-11-12 18:12:55
【问题描述】:

我们在一些查询中遇到了死锁(选择查询导致死锁更新查询)。默认情况下 kodo READS_COMMITTED,这对于更新查询是可以的。我知道我们可以在应用程序级别设置此属性:

kodo.jdbc.TransactionIsolation: read-uncommitted

但就我而言,我只想在单个 kodo 查询中指定事务隔离。 那可能吗?我对 kodo 很陌生,所以任何帮助/cmets 都非常感谢。

【问题讨论】:

  • 使用 JDO 还是 JPA ? JDO(2.2) 允许 Transaction.setIsolationLevel。我怀疑 Kodo 是否支持 JDO 2.2,但 DataNucleus JDO 支持。
  • 我们正在使用 kodo-jdo 3.4.0 和 jdo 1.0.2,我们不会很快升级它。我想我们当时被困住了..??

标签: java jdo kodo


【解决方案1】:

在 JDO 中使用 Kodo 的文档:

Kodo 提供了明确的 API 来锁定对象并检索它们 当前锁定级别。 Kodo JDO KodoPersistenceManager 公开了以下方法 显式锁定对象

您有以下锁定对象的方法:

public void lockPersistent (Object pc);
public void lockPersistent (Object pc, int level, long timeout);
public void lockPersistentAll (Object[] pcs);
public void lockPersistentAll (Object[] pcs, int level, long timeout);
public void lockPersistentAll (Collection pcs);
public void lockPersistentAll (Collection pcs, int level, long timeout);

还有下一个例子:

//获取对象的锁级

Stock stock = ...;
int level = KodoJDOHelper.getLockLevel (stock);
if (level == KodoJDOHelper.LOCK_WRITE) 
        PersistenceManager pm = ...;
        pm.currentTransaction ().setOptimistic (true);
        pm.currentTransaction ().begin ();
        // override default of not locking during an opt trans to lock stock object
        KodoPersistenceManager kpm = KodoJDOHelper.cast (pm);
        kpm.lockPersistent (stock, KodoPersistenceManager.LOCK_WRITE, -1);
        stock.setPrice (market.calculatePrice (stock));
        pm.currentTransaction ().commit ();

【讨论】:

    【解决方案2】:

    我们最终在 Kodo 3.4.0 中做的是使用 CONN_RETAIN_PM(需要向下转换):

    try {
        pm = (KodoPersistenceManager)
            ((KodoPersistenceManagerFactory) kpmf).getPersistenceManager(false,
            KodoPersistenceManager.CONN_RETAIN_PM);
        Connection c = ((Connection)pm.getConnection());
        c.setTransactionIsolation(
            ISQLServerConnection.TRANSACTION_READ_UNCOMMITTED);
    
        // ... use pm with retained connection ...
    
    } finally { // reset retained connection, e.g. if pooled
        if (pm != null) {
            Connection c = ((Connection)pm.getConnection());
            c.setTransactionIsolation(
                ISQLServerConnection.TRANSACTION_READ_UNCOMMITTED);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-20
      • 2013-11-20
      • 1970-01-01
      • 1970-01-01
      • 2011-12-17
      • 1970-01-01
      • 2016-05-12
      • 1970-01-01
      相关资源
      最近更新 更多