我有一个看起来像这样的域对象:
class UserStuff
{
String userid;
boolean primordial;
}
在表格中,原始是 TINYINT 。 用户可能包含许多 UserStuff 。我想要确保的是,只有一行(创建的第一行)将具有原始== 1.所有后续行将具有原始== 0.一目了然,没有什么可担心的。假设对 UserStuff 的多个创建请求可能同时发生,我该如何保证这种约束?
我最初的想法是在字符串上同步(在域名服务中)
class DomainService
{
public void create( UserStuff stuff )
{
synchronized( stuff.userid + "/userstuff/lock" )
{
...
}
}
}
我很想听到关于此事的评论。替代方法。感谢
答案 0 :(得分:1)
一般来说,SQL方法是使(userid, primordial)
成为唯一的复合键,并使用带有INSERT
子句的ON DUPLICATE KEY UPDATE
语句 - 设置primordial
否则(但我承认我不确定如果UPDATE
也会重复发生会发生什么,就像插入第二个非原始UserStuff
时那样。
或者,通过适当隔离的交易,您可以先SELECT
检查userid
是否已存在,然后在相同的交易INSERT
中使用primordial
的相应值
如果您从多个进程(可能在不同的客户端节点上)获得更新,那么SQL方法会更加可靠,但如果您100%确定永远不会发生基于Java同步的想法可能会获得更好的性能。 ..我不会猜这种或那种方式,但建议你两种方式测量(如果你愿意从不打赌你的衬衫,从不从中获取更新多个客户端节点,即; - )。
`