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