play 2.x アプリケーションで、親テーブルから子メンバーを削除するために使用されるポスト リクエストがあります。同じ要求パラメーターを持つ複数の要求がある場合、同時アクセスと同じレコードの重複削除を避けるために、Play に子リストをロックするように依頼するにはどうすればよいですか? 重複したリクエストが非常に近い間隔で送信されると、次のように例外がスローされます。
javax.persistence.OptimisticLockException: データが変更されました。更新された [0] 行 sql[channel_detail から削除、id=? と member_id=? および channel_info_id=?] bind[null]
@BodyParser.Of(BodyParser.FormUrlEncoded.class)
public static Result removeMemberFromChannel() {
RequestBody body = request().body();
Map<String, String[]> dict = body.asFormUrlEncoded();
final String memberId = dict.get("memberId") != null ? dict.get(Config.MEMBER_ID_PARAM)[0] : null;
ChannelInfo channelInfo = ChannelInfo.getChannelForName(channelName); //method was removed to save space
if (channelInfo != null) {
channelInfo.removeMemberId(memberId);
channelInfo.save();
}
}
@Entity
@Table(name="channel")
public class ChannelInfo extends Model {
@Id
private Long id;
@Constraints.Required
private String channelName;
@OneToMany(cascade=CascadeType.ALL, mappedBy="channelInfo")
private Set<ChannelDetailMember> members;
private int membersCount = 0;
public void removeMemberId(String memberId) {
Iterator<ChannelDetailMember> iter = this.getMembers().iterator();
while (iter.hasNext()) {
ChannelDetailMember dMember = iter.next();
if (dMember.getMemberId().equals(memberId)) {
dMember.delete();
membersCount--;
break;
}
}
}
}
@Entity
@Table(name="channel_detail")
public class ChannelDetailMember extends Model {
@Id
private Long id;
@Constraints.Required
private String memberId;
@Constraints.Required
@ManyToOne(cascade=CascadeType.PERSIST)
ChannelInfo channelInfo;
}