php+mysql/mariadb+避免竞争条件

vxf3dgd4  于 2021-06-18  发布在  Mysql
关注(0)|答案(1)|浏览(417)

这个问题在这里已经有答案了

增加字段时,如何确保mysql数据库中没有竞争条件(2个答案)
在浏览器中编辑时锁定文件/内容(1个答案)
两年前关门了。
我用apache、mysql和php开发了一个web应用程序。
此web应用允许多个用户登录到应用程序。然后,通过应用程序,他们可以访问数据库。
因为当两个或更多的用户试图选择/更新/删除相同的信息(在我的例子中是一个表的行)时,竞争条件可能适用,所以我正在寻找避免这种竞争条件的最佳方法。
我试过使用mysqli,将autocommit设置为off,并使用select。。。。对于更新,但据我所知,这与php不起作用,在为用户提供/加载php-->html页面时,每个事务都会自动提交,并且每个到db的连接都会自动释放。
看完一些帖子,我的问题似乎有两种可能的解决方案:
使用pdo。据我所知,pdo创建了到db的连接,当html页面加载时,这些连接不会被释放。但应采取特别的预防措施,因为如果用户退出页面而pdo连接尚未释放,则可能会保留锁。。。
在相应的表中添加一个“locked”列来标记锁定的行。例如,当更新事务只能在相应用户锁定行进行编辑时执行。其他用户不允许修改。
pdo的主要问题是我必须修改php代码,以便在适用的情况下用pdo替换mysqli。
场景2的问题是我还需要修改db模式,为lock/unlock添加额外的编码,并考虑“挂起”锁定行的可能性,这可能会导致在表中添加额外的列(例如,存储行被锁定的时间和lockedby信息)以及代码(例如,在用户端运行javascript来更新锁定的时间,以便用户使用行时连续标记该行…)
您的意见基于您的经验将不胜感激!!!
谢谢您。

bn31dyow

bn31dyow1#

它可能是一个观点,而不是一个技术性的答案,但太长了,写它作为一个评论。
我想把它想象成在电影或航班中预订座位:当用户选择一个座位并按next时,该座位将为该用户保留一定的时间,当用户在给定的时间内没有完成时,它将得到一个超时异常,而不进行进一步处理。您可以使用行旁边的编辑按钮,当用户单击该按钮时,在服务器端检查该行是否保留给其他人,如果没有,则保留给用户。当其他用户也在该用户之后单击“编辑”按钮时,将不会获得编辑表单。我不知道数据库系统是如何处理的。
但是,有一种方法可以确保,在用户编辑并提交该行以显示用户之后,重新读取该行。如果有任何锁定机制阻止了行的更新,用户也会通过看不到行中的更改来知道它。

相关问题