2009-10-12 20 views
2

我正在尝试使用PHP和MySQL实现两阶段提交,并且简短介绍。使用PHP和MySQL进行事务处理

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

这里是我想要的代码的情况:

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

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

任何意见是值得欢迎的,即使是“这是不可能的PHP”

+1

听起来像一个棘手的问题重新连接到另一个请求的数据库句柄。另外,如果您使用PDO :: beginTransaction PDO将在脚本结束时自动回滚事务。你能解释为什么你需要这样做吗? – rojoca 2009-10-12 18:38:20

回答

2

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

它提供了分布式事务处理和两个阶段提交功能,以及。

Regards

Ch。 F.

+0

有趣。我一定会检查一下。 – TomL 2012-04-25 10:55:55

2

由于基于持续的数据库连接的执行PHP是请求/响应不possbile,据我所知。

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

  1. 用户发送数据
  2. Server启动MySQL的交易和执行基于它已接收到的数据有些查询,分配一个“独特的”票到该交易。
  3. 服务器向用户发送文件并返回票据
  4. 当用户成功接收文件并发送了包含该票证的另一个请求时,服务器将提交其事务。否则它会回滚。
  5. 指的卡西的评论:在一定的时间段毕竟不是COMMITED助教应以防止你的数据库从beeing“淹没”老交易

HTH

+1

不错的主意!不过,我会添加第五个项目符号点:回滚也应该在没有用户上传的指定时间之后发生。否则,数据库将被填充取消的操作。 – 2009-10-12 10:04:53

+1

这就是我想到的,这张票是对共享内存中的id的引用,在共享内存中我将数据库句柄存储在待处理的事务中。唯一的问题是你不能在PHP中序列化数据库句柄,所以我留下了无法确保第二个请求获得第一次相同的db句柄的问题。据我所知,交易必须在他们开始的同一个数据库连接上承诺。有没有办法为交易添加标签以便稍后返回给他们? – TomL 2009-10-13 04:12:30

+0

我不认为这是可能的。我会坚持所提到的解决方法,并尝试用我自己的事务表“模拟”事务机制。像STRING(这里是实际的SQL字符串)BOOLEAN(提交)。第一个请求将查询写入临时表,标记为toCommit = false;第二个请求执行实际请求。我同意rojoca的问题:你为什么不想这样明确地做到这一点? – KB22 2009-10-13 06:54:07

0

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

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

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

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

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

感谢您的所有意见。

相关问题