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,因此我必须仔细阅读。有可能获得多个客户端更新,因此并发性是我必须处理的问题。