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

Java 如何确保只创建具有特定状态的表行?,java,mysql,multithreading,concurrency,transactions,Java,Mysql,Multithreading,Concurrency,Transactions,我有一个域对象,看起来像这样: class UserStuff { String userid; boolean primordial; } 在表中,primordial是一个小罐子。一个用户可能有许多UserStuff。我要确保的是,创建的第一行中只有一行的primordial==1。所有后续行的primordial==0。乍一看,没什么好担心的。让我们假设UserStuff的多个创建请求可能同时发生,我如何保证这个约束 我最初的想法是在域服务中同步字符串 class Do

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

class UserStuff 
{
    String userid;
    boolean primordial;
}
在表中,primordial是一个小罐子。一个用户可能有许多UserStuff。我要确保的是,创建的第一行中只有一行的primordial==1。所有后续行的primordial==0。乍一看,没什么好担心的。让我们假设UserStuff的多个创建请求可能同时发生,我如何保证这个约束

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

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

        }
    }
}

我很想听到关于这方面的评论&其他方法。感谢

一般来说,SQL方法是将userid、primordial设置为唯一的复合键,并使用INSERT语句和ON DUPLICATE key UPDATE子句,这将primordial设置为其他形式,但我承认,如果更新也遇到重复项,我不确定会发生什么,就像插入第二个非原始UserStuff时一样

或者,对于适当隔离的事务,您可以首先选择检查该用户标识是否已经存在,然后在同一事务中插入适当的primordial值

如果在不同的客户机节点上有来自多个进程的更新,那么SQL方法将更加可靠,但是如果您100%确信这种情况永远不会发生,那么基于Java同步的想法可能会获得更好的性能。。。我不会以这样或那样的方式猜测,但如果您愿意打赌从不,从不从多个客户端节点获取更新,那么建议您以两种方式来衡量事情,也就是;-


`

一般来说,SQL方法是将userid、primordial设置为唯一的复合键,并使用INSERT语句和ON DUPLICATE key UPDATE子句,这将primordial设置为其他形式,但我承认,如果更新同时遇到重复项,我不确定会发生什么,就像插入第二个非原始UserStuff时一样

或者,对于适当隔离的事务,您可以首先选择检查该用户标识是否已经存在,然后在同一事务中插入适当的primordial值

如果在不同的客户机节点上有来自多个进程的更新,那么SQL方法将更加可靠,但是如果您100%确信这种情况永远不会发生,那么基于Java同步的想法可能会获得更好的性能。。。我不会以这样或那样的方式猜测,但如果您愿意打赌从不,从不从多个客户端节点获取更新,那么建议您以两种方式来衡量事情,也就是;-


`

我不熟悉关于重复密钥更新的内容,因此我必须仔细阅读。有可能获得多个客户端更新,因此并发性是我必须处理的问题。我不熟悉ON DUPLICATE KEY UPDATE,因此我必须仔细阅读。有可能获得多个客户端更新,因此并发性是我必须处理的问题。