4

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(...);
    }

このクエリはデッドロックを引き起こします。 から読み取っているときt2insert .. select、別のプロセスが に行を挿入しようとしt2ます。

t2実行時の読み取りの一貫性は気にせず、トランザクション分離レベルをREAD_UNCOMMITTEDinsert .. selectに設定したいと考えています。

JPAで設定するにはどうすればよいですか?


アップデート

したがって、この場合、最も単純なオプションのように思われたため、通常のSQL接続を作成することになりました。みんな、ありがとう!

4

3 に答える 3

4

接続レベルで設定し、entitymanager からセッションを取得して、これを行う必要があります。

org.hibernate.Session session = (Session)entityManager.getDelegate();
Connection connection = session.connection();
connection.setTransactionIsolation(Connection.READ_UNCOMMITTED);
于 2010-05-27T19:19:16.857 に答える
3

JPAではそうではありません。JDO は、txn 分離の設定をサポートする唯一の標準です。明らかに、特定の実装方法を使用すると許可されますが、移植性がなくなります

于 2010-05-28T10:52:55.667 に答える
0

BMTを使用しているため、データソースを使用して次の操作を実行して接続を取得できます。ISOを設定します。レベル。

DataSource source = (javax.sql.DataSource) jndiCntxt.lookup("java:comp/env/jdbc/myds");
Connection con = source.getConnection( );
con.setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED);
于 2010-05-28T22:46:55.890 に答える