2

我正在尝试使用 PHP 和 MySQL 实现两阶段提交,但结果很短。

我发现的主要障碍是我无法将 MySQL 连接资源存储在第二阶段可以再次找到它的地方。是否可以序列化数据库句柄?

这是我尝试编写代码的情况:

  1. 用户发送数据
  2. 服务器启动一个 MySQL 事务并根据它收到的数据执行一些查询。
  3. 服务器将文件发送回用户
  4. 当用户成功接收文件时,服务器提交其事务。否则它会回滚。

这似乎需要两个 HTTP 请求/响应周期,因此我需要能够在第二个请求中重新连接到同一个数据库句柄才能提交事务。这部分我一直失败。

欢迎任何建议,即使它是“这在 PHP 中是不可能的”

4

3 回答 3

2

由于php是基于请求/响应的,因此不可能实现持久的数据库连接,AFAIK。

您可以尝试使用某种票务机制来解决此限制。你的步骤是:

  1. 用户发送数据
  2. 服务器启动一个 MySQL 事务并根据它收到的数据执行一些查询,为该事务分配一个“唯一”票证。
  3. 服务器将文件和票证发送回用户
  4. 当用户成功接收文件并发送包含该票证的另一个请求时,服务器将提交其事务。否则它会回滚。
  5. 参考 Cassy 的评论:一段时间后,所有未提交的 TA 都应回滚,以防止您的数据库被旧事务“淹没”

高温高压

于 2009-10-12T09:20:38.217 回答
2

看看 LIXA 事务管理器 (http://lixa.sourceforge.net/),它从 0.9.0 版开始集成了 PHP 和 MySQL

它还提供分布式事务处理和两阶段提交功能。

问候

通道。F。

于 2012-04-22T10:15:13.770 回答
0

要回答 KB22 和 rojoca,我需要这样做的原因是我所指的“文件”实际上是一个 sqlite 数据库,它最终成为移动设备上的数据存储。

第一个请求将更新的 sqlite 数据库发布到服务器,服务器尝试合并来自 sqlite 表的数据;当移动设备没有成功接收到新的 sqlite 数据库(反映移动设备的更改和来自 Web 应用程序的任何其他新内容的数据库)时会出现问题,因为它会尝试将相同的(旧)sqlite 数据库发送到web ,导致在移动设备上创建的任何内容的 web 表中出现重复条目​​。

因此,在提交合并更改之前,Web 需要确保设备具有新数据库。鉴于网络的变幻莫测,这似乎只有在设备可以在接收到新的 sqlite 数据库后发送显式 ACK 时才可行。这只有在我们发出两个请求时才有可能(1. 要合并的 sqlite 数据库;2. 设备上收到新的 sqlite 数据库的 ACK)。

确实是一个棘手的问题,它是发现 PHP 无法将数据库句柄操作到必要级别的有用信息。

[我也不认为我可以使用事务表,因为我需要根据“真实”网络数据库表将数据返回到设备。如果我不使用真实的表格,我想我会遇到 auto_increment 字段的问题]

谢谢你们的评论。

于 2009-10-13T12:50:01.927 回答