如何确保只创建具有特定状态的表行?

时间:2009-05-22 05:06:43

标签: java mysql multithreading concurrency transactions

我有一个看起来像这样的域对象:

class UserStuff 
{
    String userid;
    boolean primordial;
}

在表格中,原始 TINYINT 用户可能包含许多 UserStuff 。我想要确保的是,只有一行(创建的第一行)将具有原始== 1.所有后续行将具有原始== 0.一目了然,没有什么可担心的。假设对 UserStuff 的多个创建请求可能同时发生,我该如何保证这种约束?

我最初的想法是在字符串上同步(在域名服务中)

class DomainService
{
    public void create( UserStuff stuff )
    {
        synchronized( stuff.userid + "/userstuff/lock" )
        {
            ...

        }
    }
}

我很想听到关于此事的评论。替代方法。感谢

1 个答案:

答案 0 :(得分:1)

一般来说,SQL方法是使(userid, primordial)成为唯一的复合键,并使用带有INSERT子句的ON DUPLICATE KEY UPDATE语句 - 设置primordial否则(但我承认我不确定如果UPDATE也会重复发生会发生什么,就像插入第二个非原始UserStuff时那样。

或者,通过适当隔离的交易,您可以先SELECT检查userid是否已存在,然后在相同的交易INSERT中使用primordial的相应值

如果您从多个进程(可能在不同的客户端节点上)获得更新,那么SQL方法会更加可靠,但如果您100%确定永远不会发生基于Java同步的想法可能会获得更好的性能。 ..我不会猜这种或那种方式,但建议你两种方式测量(如果你愿意从不打赌你的衬衫,从不从中获取更新多个客户端节点,即; - )。

`