首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何设置单个kodo查询的事务隔离级别?

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

Stack Overflow用户
提问于 2014-11-13 02:12:56
回答 2查看 189关注 0票数 0

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

代码语言:javascript
复制
kodo.jdbc.TransactionIsolation: read-uncommitted

但在我的例子中,我只想在单个kodo查询上指定事务隔离。这有可能吗?我是kodo的新手,所以任何帮助/评论都非常感谢。

EN

回答 2

Stack Overflow用户

发布于 2016-10-11 02:34:40

将Kodo的文档与JDO结合使用:

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

您可以使用以下方法锁定对象:

代码语言:javascript
复制
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);

下一个例子:

//获取对象的锁级别

代码语言:javascript
复制
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 ();
票数 0
EN

Stack Overflow用户

发布于 2016-12-16 00:57:56

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

代码语言:javascript
复制
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);
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26893692

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档