跨多个PHP请求的MySQL事务

跨多个PHP请求的MySQL事务,php,mysql,transactions,Php,Mysql,Transactions,我想创建一个界面,以类似事务的方式操作发票 该数据库由一个发票表(保存账单信息)和一个发票行表(保存发票行项目)组成。该网站是一组脚本,允许添加、修改和删除发票及其对应行 我的问题是,我希望数据库的ACID属性能够反映在web应用程序中 原子的:当用户点击保存时,要么修改整个发票,要么根本不更改整个发票 一致性:应用程序代码已确保一致性,不能将行添加到不存在的发票中。发票ID不能重复 强>孤立< /强>:如果用户处于一组发票更改的中间,我希望将这些更改隐藏在其他用户之前,直到用户单击Save.

我想创建一个界面,以类似事务的方式操作发票

该数据库由一个发票表(保存账单信息)和一个发票行表(保存发票行项目)组成。该网站是一组脚本,允许添加、修改和删除发票及其对应行

我的问题是,我希望数据库的ACID属性能够反映在web应用程序中

  • 原子的:当用户点击保存时,要么修改整个发票,要么根本不更改整个发票
  • 一致性:应用程序代码已确保一致性,不能将行添加到不存在的发票中。发票ID不能重复
  • 强>孤立< /强>:如果用户处于一组发票更改的中间,我希望将这些更改隐藏在其他用户之前,直到用户单击Save.
  • 持久性:如果网站死亡,数据应该是安全的。这已经奏效了
如果我正在编写一个桌面应用程序,它将始终保持与MySQL数据库的连接,允许我在编辑的开始和结束时简单地使用BEGIN事务和COMMIT

据我所知,您不能在一个PHP页面上开始事务,而在另一个页面上提交,因为页面之间的连接是关闭的


有没有一种方法可以在没有扩展的情况下实现这一点?据我所知,只有这样做(但它是一个扩展)。

解决方案是在获取阶段不打开事务。事务的所有方面都在“保存”按钮触发的POST期间开始事务、处理和提交。

您不希望事务长时间运行,因为这会限制并发性

数据库事务并不是真正用于此目的的—如果确实使用它们,可能会遇到其他问题

但您也不能使用它们,因为每个页面请求都使用自己的连接(可能),因此无法与任何其他页面共享事务

在用户编辑发票时,将对发票的修改保留在其他地方,然后在单击“保存”时应用这些修改;您可以在事务中执行最后的应用步骤(尽管这是一个非常短暂的步骤)


长期存在的事务通常是不好的。

持久连接可以帮助您:

另一个是当使用 事务时,将显示一个事务块 也可以转到下一个脚本 如果脚本 执行在事务之前结束 布洛克有

但我建议你找到另一种解决问题的方法。 例如:创建缓存表。
当您需要“提交”时,将记录从缓存表传输到“真实”表。

这种类型的处理在web上的转换是使用会话数据或存储在页面本身中的数据。通常情况下,完成每个网页后,数据存储在会话(或页面本身)中,并在所有页面完成时(通过数据输入)点击“处理”(或“保存”)按钮,数据被转换成数据库形式并保存——即使使用您提到的数据的关系方面也是如此。有很多方法可以做到这一点,但我要说的是,大多数开发人员都有一个类似于我所提到的(使用页面中的会话数据或状态)的体系结构来满足您所谈论的内容


在这里,您将得到许多关于不同体系结构的建议,但我可以说,Zend框架()和Doctrine()的使用使这一点变得容易,因为Zend提供了MVC体系结构和会话管理的大部分内容,Doctrine提供了您要找的基本CRUD(创建、检索、更新、删除),以及所有其他方面(唯一性、提交、回滚等)。保持与mysql的连接打开可能会导致超时和缺少可用连接。

尽管有一些好的答案,但我认为我还是找到了一些很好的答案来回答你的问题。我认为最好的方法是使用类似于条令(O/R映射)的框架这就以某种方式实现了这种方法。您可以链接到我所说的内容。

这种想法的问题是,另一个用户可能会编辑我的数据。这需要额外的代码来跟踪每个发票的更改(即修订号)。本机事务只会引发提交冲突,我的应用程序可以将该冲突重新提交给用户。@Martin:若要处理并发问题,请在表中添加一个版本列因此,除非版本值在用户当前编辑的内容和数据库当前存储的内容之间匹配,否则无法更新/删除记录。在这种情况下,您需要创建悲观或乐观锁定机制,以防止其他用户这样做。悲观通过“锁定”根据您想要阻止或乐观的层次结构的某一部分中的一个键,排除其他用户(假设这种情况不会经常发生)通过要求他们重新输入数据。是的,如果其他人编辑了同一张发票,这到底是怎么回事?!也许在另一个数据世界中,这种情况经常发生,但在会计中,我甚至不允许编辑或删除,只允许添加新行——贷项和借项。@Don:在我的系统中,发票可以修改,直到过账。Once发票已过帐,已锁定,无法进一步更改。进行更改的唯一方法是创建另一张发票作为更正。此外,发票不是我希望使用此系统管理的唯一数据类型。