gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 21:24:19 25 4
gpt4 key购买 nike

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

class UserStuff 
{
String userid;
boolean primordial;
}

在表中,primordial 是一个TINYINT。一个User 可能有很多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 否则(但我承认我不确定如果 UPDATE 也命中重复会发生什么,因为它当你插入 second 非原始 UserStuff 时会这样)。

或者,对于适当隔离的事务,您可以首先SELECT 检查该userid 是否已经存在,然后在同一事务中INSERT具有适当的 primordial 值。

如果您有来自多个进程(可能在不同的客户端节点上)的更新,SQL 方法会更可靠,但如果您 100% 确定这种情况永远不会发生,您基于 Java 同步的想法可能会获得更好的性能。 .. 我不会猜测任何一种方式,但建议您以两种方式衡量事物(如果您愿意打赌永远不会,永远不会从多个客户端节点,即;-).

`

关于java - 如何确保只创建具有特定状态的表行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/896437/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com