2016-08-02 4 views
1

Spring/OpenJPA 1アプリケーションで同じ確認コードを同時に使用できないようにする必要があります。 select for update戦略を使用することにしたので、テーブルAdmissionLock(id、Confirmation_Code、Terminal)を作成しました。
別個のサンプルJDBCアプリケーションは、この戦略で正常に動作します。それは、異なる確認コードの同時処理を可能にし、同じ確認コードの同時処理を可能にしない。Spring/OpenJPA 1の更新行ロックの選択を再作成する方法1

スレッドコード:

conn.setAutoCommit(false); 
long retId = Util.lockBySelectUpdate(conn, threadName, terminalCode, confNumber); 
Util.updateConfCode(conn, threadName, terminalCode, confNumber); 
conn.commit(); 

メインプログラムコード:

String confCode1 = "21"; 
String confCode2 = "22"; 
String terminalCode1 = "10"; 
String terminalCode2 = "11"; 
Connection conn1 = Util.getNewConnection(); 
Connection conn2 = Util.getNewConnection(); 
AdmissionThread admissionThread1=new AdmissionThread(terminalCode1, conn1, confCode1, "Thread1", 10); 
AdmissionThread admissionThread2=new AdmissionThread(terminalCode2, conn2, confCode2, "Thread2", 0); 
    admissionThread1.start(); 
    Thread.sleep(2000); 
    admissionThread2.start(); 

SQL:我々のアプリケーション以来

"SELECT * FROM ADMISSIONLOCK WHERE CONFIRMATION_CODE=? FOR UPDATE" 

"update ADMISSIONLOCK set CONFIRMATION_CODE=? where TERMINAL_SERIAL_NUMBER=?;";   

は春/ OpenJPAの1、以下のサンプルコードを参照してください。このアイデアをSpring/OPenJPA 1のコードに組み込む必要があります。私の問題は、このコードは何かをロックしないということである

@Entity 
@Table (name = SdiAdmissionLock.TABLE_NAME) 
public class SdiAdmissionLock extends AbstractEntityImpl { 

    private static final long serialVersionUID = 1L; 
    private long uidpk; 
    private String terminalSerialNumber; 
    private String confirmationCode; 
    private Date createdDate; 

    public static final String TABLE_NAME = "SDIADMISSIONLOCK"; 
... 
} 

@Transactional 
public void processAdmissionLock (String terminalSerialNumber, String confirmationCode){ 

AdmissionLock admissionLock = new AdmissionLock(terminalSerialNumber, confirmationCode); 
     query = entityManager.createNativeQuery(SQL_LOCK_STRING); 
     entityManager.lock(admissionLock, LockModeType.READ); 
     query.setParameter(1, confirmationCode).getResultList(); 

     if(isEntityPersistent(admissionLock)) { 
      admissionLock = entityManager.merge(admissionLock); 
     } else { 
      entityManager.persist(admissionLock); 
     } 
} 

AdmissionLockエンティティ:だから、私はこの単純化されたコードを使用してサービスを作成しました。同じ確認コードを持つ両方の同時スレッドが通過する

答えて

0

JDBCアプリケーションと同じネイティブクエリを使用してしまいました。重要な違いの1つは、開始トランザクション( "START TRANSACTION")とコミット( "COMMIT")はMYSQL自体に移され、JDBC executeUpdate()メソッドによって呼び出されます。

関連する問題