2014-11-12 2 views
0

Мы столкнулись с тупиками в некоторых запросах (выберите запросы, вызывающие запоздалые запросы на обновление). По умолчанию kodo READS_COMMITTED, что подходит для запросов на обновление. Я знаю, что мы можем установить это свойство на уровне приложения:Как установить уровень изоляции транзакции для одного запроса kodo?

kodo.jdbc.TransactionIsolation: read-uncommitted 

Но в моем случае, я просто хочу, чтобы определить изоляцию транзакций на одном запросе коды. Возможно ли это? Я довольно новичок в kodo, поэтому любая помощь/комментарии заслуживает высокой оценки.

+0

Использование JDO или JPA? JDO (2.2) позволяет Transaction.setIsolationLevel. Я сомневаюсь, что Kodo поддерживает JDO 2.2, но DataNucleus JDO. –

+0

Мы используем kodo-jdo 3.4.0 и jdo 1.0.2, и мы не обновляем его в ближайшее время. Наверное, мы застряли тогда .. ?? – stillLearning

ответ

0

Использование документации Кодо с JDO:

Кодо предоставляет явные API-интерфейсы для блокировки объектов и получить их текущий уровень блокировки. кодо СДО 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(); 
0

Wha t мы заканчиваем работу в 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); 
    } 
}