gpt4 book ai didi

php - 处理现实世界中的交易

转载 作者:可可西里 更新时间:2023-11-01 08:56:06 27 4
gpt4 key购买 nike

我正在重写这个问题,因为它没有得到回应。

我正在尝试找出处理数据库事务的正确方法。我所看到的关于如何进行交易的一切都是非常基本的,大致如下:

  1. 查询“begin”开始交易
  2. 运行您的查询。
  3. 如果一切正常,提交交易。

我明白了,但我不明白这是错误(死锁)处理。我听说过两种选择:

  1. 向用户显示错误并说“再试一次”
  2. 当场重试,直到成功。

对我来说,因为这样的技术问题而告诉用户再试一次似乎很糟糕 - 实际应用程序是否经常这样做?这是我有时看到的“糟糕,出了点问题”的一次性错误吗?这是针对网站的,因此用户甚至不应该知道数据库。

所以我有几个问题:

  1. 对于同时涉及多个用户的数据,我应该采用哪种故障处理方法?
  2. 如果我选择“即时重试”选项,这对复杂的 PHP 脚本意味着什么?从顶部重新启动整个请求?我担心这会导致比解决的问题更多的问题。
  3. 还有我没见过的第三种选择吗?

最佳答案

我使用的解决方案是有一个重试循环,比方说 3(我认为在大多数应用程序的现实生活中我得到的重试次数不超过 1 次)。在这个循环中,交易的所有请求都必须完成,即写请求和读请求。

一个非常重要的一点是在事务内部执行读取请求,因为这会设置锁,这是使数据处于真正隔离级别的唯一方法。

然后所有这些请求都在 begin/commit block 中,带有 try/catch。在 catch 部分,我运行回滚并重新抛出异常。

通过重新抛出异常,您可以在更高级别捕获它,也就是您可以决定重新运行(3 次循环)或将其发送给用户的级别。

根据您的应用程序的编码方式,有多种解决方案可以很好地处理此问题:

  • 使用事务管理器对象负责开始/提交/回滚,事务中的所有查询
  • 获取规则,比如“所有事务都由 Controller 处理,没有 DAO 或 DB 级对象知道是否有事务正在运行”
  • 您甚至可以使用只有事务管理器使用的专用数据库连接(具有写入权限),并为其他事情保留原始的只读数据库连接。

关于php - 处理现实世界中的交易,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4394697/

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