私の機能は、ユーザーアドレスを挿入したいようなもので、ユーザーは複数のアドレスを持つことができます.下のデフォルトアドレスは私のコードであるため、ユーザーはそのアドレスの1つをマークすることもできます. ユーザーがアドレスを入力し、そのアドレスをデフォルトとしてマークすると、コードに示されているように、他のアドレスのデフォルト フラグを false にリセットします。
@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT, readOnly = false)
public Address store(Address address){
Assert.notNull(address, "address can not be null");
resetDefault(address);
Address createdAddress = this.create(address);
return createdAddress;
}
どこ
private void resetDefault(Address address) {
if (address.isDefault())
resetDefaultAddress(address);
}
private void resetDefaultAddress(Address address) {
addressRepository.unsetDefaultAddress(address.getAssociationId(),
address.getCategory());
}
JPAリポジトリを使用しました
@Modifying
@Query("update Address a set a.defaultAddress = false where a.defaultAddress = true and a.associationId =:associationId and a.category =:category")
int unsetDefaultAddress(@Param("associationId") String associationId,
@Param("category") AddressCategory category);
今私の問題は、開発者環境で正常に動作していることですが、100 の同時要求を実行したアプリケーションの負荷テストを行うと、
org.springframework.dao.CannotAcquireLockException: Could not execute JDBC batch update; SQL [insert into wsc_address (address1, address2, address3, alias, associationId, attributes, category, city, country, defaultaddress, email1, email2, firstname, lastaccesstimestamp, lastname, phone1, phone2, phone3, postalcode, province, status, id) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)]; nested exception is org.hibernate.exception.LockAcquisitionException: Could not execute JDBC batch update
Caused by: org.hibernate.exception.LockAcquisitionException: Could not execute JDBC batch update
MySql データベースを使用しています。
または、私の目的を解決し、パフォーマンスを向上させる単一のクエリ。
また、コメントアウトした後、resetDefault(address); にも気付きました。ストアメソッドからは正常に動作しています。