使用PHP和MySQL进行事务处理

时间:2009-10-12 09:09:59

标签: php mysql transactions 2phase-commit

我正在尝试使用PHP和MySQL实现两阶段提交,并且还要简短。

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

以下是我正在尝试编写代码的案例:

  1. 用户发送数据
  2. 服务器启动MySQL事务并根据收到的数据执行一些查询。
  3. 服务器将文件发送回用户
  4. 当用户成功收到文件后,服​​务器会提交其事务。否则它会回滚。
  5. 这似乎需要两个HTTP请求/响应周期,因此我需要能够在第二个请求中重新连接到相同的数据库句柄才能提交事务。我一直在这方面失败。

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

3 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:2)

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

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

此致

章。 F。

答案 2 :(得分:0)

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

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

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

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

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

感谢您的所有评论。