2014-04-03 2 views
0

У меня есть два потока, A и B, и каждый из них вставляет данные в две разные и несвязанные таблицы. Однако я получаю org.hibernate.TransactionException: nested transactions not supported.Темы и транзакции: вложенные транзакции не поддерживаются

Вот код делает вставку для резьбы A:

@Override 
    public void setA(List<A> a) throws HibernateException { 

     if (session == null) { 
      session = sessionFactory.openSession(); 
     } 
     Transaction tx = session.beginTransaction(); 
     try { 
      int count = 0; 
      for (A row : a) { 
       session.save(row); 

       if (count++ % 1000 == 0) { 
        session.flush(); 
        session.clear(); 
       } 
      } 
      tx.commit(); 
     } catch (Exception e) { 
       tx.rollback(); 
     } finally { 
      session.close(); 
     } 
    } 

Другой метод, называемый по нити B аналогична, только устанавливает Bs вместо As ...

Как я получить эти 2 потока для запуска одновременно без этого исключения?

+0

Поскольку ваш метод создает и завершает транзакцию внутри себя, каждый поток будет иметь разные транзакции. Похоже, что до того, как этот метод вызывается потоком, уже существует транзакция, связанная с этим потоком. Вероятно, вы уже создаете транзакцию где-то в коде, прежде чем этот фрагмент будет работать. – Shailendra

ответ

1

Чтобы выполнить вышеуказанную задачу, вы должны использовать блок synchronized или synchronized method.

Обратите внимание, что сеанс не является потокобезопасным объектом, но если вы уверены, что он не будет иметь проблем с параллелизмом, вам нужно просто использовать TransactionSynchronizationUtils, чтобы связать сеанс с ресурсами потока, а затем отключить по желанию

+0

У вас есть пример с TransactionSynchronizationUtils? Я не знаком с этим и не нашел много документации. – l0r3nz4cc10

Смежные вопросы