我们在某些查询中遇到了死锁(选择导致死锁更新查询的查询)。默认情况下,kodo READS_COMMITTED,这对于更新查询是可以的。我知道我们可以在应用程序级别设置此属性:
kodo.jdbc.TransactionIsolation: read-uncommitted
但就我而言,我只想在单个kodo查询中指定事务隔离。 那可能吗?我对kodo很新,所以任何帮助/评论都非常赞赏。
答案 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