我们在一些查询中遇到了死锁(select查询导致死锁的update查询)。默认情况下是kodo READS_COMMITTED,这对于update查询是可以的。我知道我们可以在应用程序级别设置此属性:
kodo.jdbc.TransactionIsolation: read-uncommitted但在我的例子中,我只想在单个kodo查询上指定事务隔离。这有可能吗?我是kodo的新手,所以任何帮助/评论都非常感谢。
发布于 2016-10-11 02:34:40
将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 ();发布于 2016-12-16 00:57:56
我们最终在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);
}
}https://stackoverflow.com/questions/26893692
复制相似问题