在PHP / MySQL CMS中实现订单并处理并发

我有以下表格:

=======================           =======================
| galleries           |           | images              |
|---------------------|           |---------------------|
| PK | gallery_id     |<--\       | PK | image_id       |
|    | name           |    \      |    | title          |
|    | description    |     \     |    | description    |
|    | max_images     |      \    |    | filename       |
=======================       \-->| FK | gallery_id     |
                                  =======================

我需要为与图库相关的图像实现一种排序方式.据我了解,关系数据库不是为分层排序而设计的.

我也希望为并发的可能性做准备,即使它在我当前的项目中不太可能成为问题,因为它是一个单用户应用程序. (因此,此处的优先事项是允许用户重新安排订单).

我不确定执行此操作的最佳方法,因为我从未在数据库中实现排序,并且对并发性还陌生.因此,我阅读了有关锁定MySQL表的信息,并且不确定在这种情况下是否应该实现它.

这是我的两个想法:

>在图像表中添加一个名为order_num的列.锁定表并允许客户端重新排列图像的顺序,然后更新表并对其解锁.
>将一个名为order_num的列添加到imagess表中(与上面的想法1一样).允许客户端一次更新一个图像的位置而无需锁定.

谢谢!

解决方法:

我的想法是:您不想将太多的工时投入到一个不可能发生的问题上.因此,请采用不会引起很多副作用的简单解决方案,如果有问题,请稍后进行修复.

在基于Web的世界中,您不想锁定表以使用户可以进行编辑,然后等待用户完成操作来解锁表.在这种情况下,用户1可能永远不会回来,他们可能会丢失会话,或者浏览器可能崩溃,等等.这意味着您必须做很多工作才能弄清楚何时解锁该表,并加上使用户2知道的代码该表已被锁定,他们对此无能为力.

我建议采用这种设计:让他们两个都使用一些JavaScript进入编辑模式,可能在他们的浏览器中.他们可以按顺序拖动图像,直到满意为止,然后完整提交订单.您可以在单个事务中将order_num字段更新到数据库.

在这种情况下,最糟糕的事情是用户1和用户2正在同时编辑,而最后编辑的人将保留其顺序.也许它们在同一时间更新,但是数据库将处理该事务,因为它将排队交易.

这个问题的后备之处在于,无论谁被覆盖订单,都必须重新做一次.烦人但没有损失,实现此目标的代码比处理锁定的代码简单得多.

我不想回避您的问题,但这就是我的想法.

上一篇:在GAE上有DAL / ORM吗?


下一篇:XSD到MySQL模式