0
私はそのように減速私のシステム内のアイテムの実体があります。私のシステムではJPAのスレッドセーフなエンティティ
@Entity
@Table(name = "ITEMS")
@XmlRootElement
public class Item implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "ID")
private Integer id;
@Column(name = "VIEWS")
private Integer views;
// More fields.........
public Item() {
}
public Item(Integer id) {
this.id = id;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getViews() {
return views;
}
public void setViews(Integer views) {
this.views = views;
}
// More getters and setters.......
}
を各ユーザーがアイテムを表示することができますが、所有者のみがそれを編集することができます。唯一の制限は、オーナーがアイテムをまだ編集できない場合にのみアイテムを編集できることです。
だから私の更新方法は、次のようになります。
public void update(Integer id) {
Item item = itemFacade.find(id);
if (item == null || item.getViews() > 0) {
return;
}
// Set some fields......
itemFacade.edit(item);
}
競合状態があるので、この方法は、同期させる必要があります:私はフィールドを設定すると、他のユーザーが項目を見ました。
しかし、その競合状態からどうすれば保護できますか?私はJPAがエンティティの新しいインスタンスを見つけたときにそのインスタンスを作成すると私はどこかで読まれたと思います。 synchronized(item)
(nullでないことを確認した後)は、ロッカーが異なるため、その競合状態に対して保護することはできません。
どうすればこのような競合状態を防ぐことができますか?