Уровень изоляции транзакций JPA и MySQL - PullRequest
3 голосов
/ 27 мая 2010

У меня есть собственный запрос, который выполняет пакетную вставку в базу данных MySQL:

    String sql = "insert into t1 (a, b) select x, y from t2 where x = 'foo'";
    EntityTransaction tx = entityManager.getTransaction();
    try {
        tx.begin();
        int rowCount = entityManager.createNativeQuery(sql).executeUpdate();
        tx.commit();
        return rowCount;
    }
    catch(Exception ex) {
        tx.rollback();
        log.error(...);
    }

Этот запрос вызывает взаимоблокировку: пока он читает из t2 с insert .. select, другой процесс пытается вставить строку в t2.

Меня не волнует согласованность операций чтения из t2 при выполнении insert .. select, и я хочу установить уровень изоляции транзакции на READ_UNCOMMITTED .

Как мне настроить его в JPA?


Обновление

Так что в итоге я создал обычное соединение SQL для этого случая, так как мне показалось, что это самый простой вариант. Спасибо всем!

Ответы [ 3 ]

4 голосов
/ 27 мая 2010

Вам необходимо установить его на уровне соединения, получить сеанс от управления данными и сделать это:

org.hibernate.Session session = (Session)entityManager.getDelegate();
Connection connection = session.connection();
connection.setTransactionIsolation(Connection.READ_UNCOMMITTED);
3 голосов
/ 28 мая 2010

В JPA нет. JDO - единственный стандарт, который поддерживает настройку изоляции txn. Очевидно, что использование определенных методов реализации может позволить это, но тогда вы становитесь непереносимыми

0 голосов
/ 29 мая 2010

Поскольку вы используете BMT, вы можете сделать следующее, используя источник данных для получения соединения. и установите ISO. уровень.

DataSource source = (javax.sql.DataSource) jndiCntxt.lookup("java:comp/env/jdbc/myds");
Connection con = source.getConnection( );
con.setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED);
...