gpt4 book ai didi

java - 在 Scala/Java 中使用 AtomicBoolean 进行数据库锁定安全吗?

转载 作者:行者123 更新时间:2023-12-02 11:02:08 25 4
gpt4 key购买 nike

我有一个应用程序,我想确保最多同时调用一个方法一次,例如在更新数据库中的用户余额时。

我正在考虑使用以下锁定机制:(下面显示 Scala 代码,但应该与 Java Lambda 类似):

object Foo{
val dbLocked = new java.util.concurrent.atomic.AtomicBoolean(false)

def usingAtoimcDB[T](f: => T):T = {
if (dbLocked.get) throw new Exception("db is locked")
dbLocked.set(true)
try f
finally dbLocked.set(false)
}
}

当可能同时调用 usingAtoimcDB 时,使用它安全吗?

编辑:下面更正的代码,如 this answer 中指出的:

def usingAtoimcDB[T](f: => T):T = {
if(dbLocked.compareAndSet(false, true)) {
//db is now locked
try f
finally dbLocked.set(false)
} else {
//db is already locked
throw new Exception("db is locked")
}
}

编辑2:

使用自旋循环。这也可以吗?

def usingAtoimcDB[T](f: => T):T = {
while (!dbLocked.compareAndSet(false, true)) {Thread.sleep(1)}
try f
finally dbLocked.set(false)
}

EDIT3:根据下面的答案和评论,我也在考虑使用队列。

最佳答案

不可取。您请求在同一服务器上的同一应用程序实例中运行的同一段代码是执行该事务的单点。也没有任何规定可以让这段代码脱颖而出。当您退休时,有人可能会启动第二个应用程序实例或其他什么。

而数据库提交/回滚是一种非常简单且可靠的机制。

当您无法编写集成(单元)测试来确保这一点时,请不要这样做。

如果你这样做:

  • 撤销普通数据库用户的表修改权限
  • 添加具有足够权限的新数据库用户

仍然:不要这样做。

关于java - 在 Scala/Java 中使用 AtomicBoolean 进行数据库锁定安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39033260/

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