gpt4 book ai didi

java - PostgreSql 中的事务

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

我想在 java 的 PosgreSql 中实现以下场景:

  • 用户选择数据
  • 用户启动事务:插入、更新、删除数据
  • 用户提交交易

我希望在交易期间其他用户无法使用数据。如果我在其他用户尝试更新表时得到异常就足够了。

我尝试过使用select for updateselect for share,但它也会锁定数据以供阅读。我已尝试使用 lock 命令,但我无法获得锁定(错误:无法获得关系“fppo10”的锁定)或另一个事务获取在尝试提交事务时锁定,而不是在更新数据时锁定。

是否存在一种在事务开始时锁定数据以防止任何其他调用 updateinsertdelete 语句的方法?

我让这个场景在 DB2 数据库上成功运行了几年。现在我需要同样的应用程序也能用于 PostgreSql。

最佳答案

终于,我想我明白你想要什么了。
这本身并不是一个“事务”问题(根据要处理的表的数量和所需的语句,您甚至可能不需要一个),它是一个应用程序设计问题。你有两种通用的方法来处理这个问题;乐观和悲观锁定。

悲观锁定是显式获取和持有锁。当您可以保证您更改行以及与之相关的内容时,以及您的交易短期时,最好使用它。您可以在购买后更新“当前余额”等情况下使用它,例如在向帐户添加销售时更新“当前余额”(更新将会发生,交易持续时间较短,因为此时没有进一步的选择)。如果用户读取一行然后去吃午饭(或休假......),悲观锁定会变得令人沮丧。

乐观锁定正在读取一行(或一组),并且采取任何类型的数据库层锁定。如果您只是阅读行,没有立即更新其中任何一个的计划,则最好使用它。通常,行数据将包含一个“版本”值(递增的计数器或最后更新的时间戳)。如果您的应用程序要更新行,它会先比较数据的原始值以确保它没有被其他东西更改,并在数据更改时提醒用户。大多数与用户交互的应用程序应该使用乐观锁定。但是,它确实要求用户注意并注意更新的值。

请注意,因为在乐观锁定中很少(并且在很短的时间内)使用锁,所以它通常不会与使用悲观锁的单独进程发生冲突。悲观锁定应用会阻止乐观应用更新锁定的行,但不会读取它们。
另请注意,这通常不适用于批量更新,批量更新几乎没有用户交互(如果有的话)。


tl;dr

不要在读取时锁定您的行。只需将旧值与应用程序上次读取的值进行比较,如果不匹配则拒绝更新(并提醒用户)。训练您的用户做出适当的回应。

关于java - PostgreSql 中的事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34436253/

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