如何为单个kodo查询设置事务隔离级别?

时间:2014-11-12 18:12:56

标签: java jdo kodo

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

kodo.jdbc.TransactionIsolation: read-uncommitted

但就我而言,我只想在单个kodo查询中指定事务隔离。 那可能吗?我对kodo很新,所以任何帮助/评论都非常赞赏。

2 个答案:

答案 0 :(得分:0)

使用Kodo与JDO的文档:

  

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 ();

答案 1 :(得分:0)

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

SELECT * 
FROM products
LEFT OUTER JOIN rating_products
ON (products.id = rating_products.product_id)
WHERE rating_products.product_id IS NULL