如何在webform中打开时锁定MySQL资源,并在关闭/完成编辑时释放

如何在webform中打开时锁定MySQL资源,并在关闭/完成编辑时释放,mysql,angular,laravel,locking,Mysql,Angular,Laravel,Locking,我正在构建一个平台,该平台应该同时为许多公司用户提供服务。该系统包含大量需要不时更新的记录。重要的是,每项更改都要记录并适当存储。我在后端使用Laravel6实现,在前端使用Angular 6实现。前端通过HTTP请求向后端发送请求。数据存储在MySQL数据库中 用户以只读或读写模式加载特定数据集。在只读模式下,不需要锁定资源,因为用户知道他只能读取数据。在读写模式下,应从用户请求数据的那一刻起锁定数据集,以便在有人处理数据时,其他用户无法请求数据集。然后,处理数据的用户可以在网络表单中打开数据

我正在构建一个平台,该平台应该同时为许多公司用户提供服务。该系统包含大量需要不时更新的记录。重要的是,每项更改都要记录并适当存储。我在后端使用Laravel6实现,在前端使用Angular 6实现。前端通过HTTP请求向后端发送请求。数据存储在MySQL数据库中

用户以只读或读写模式加载特定数据集。在只读模式下,不需要锁定资源,因为用户知道他只能读取数据。在读写模式下,应从用户请求数据的那一刻起锁定数据集,以便在有人处理数据时,其他用户无法请求数据集。然后,处理数据的用户可以在网络表单中打开数据进行编辑。用户保存、取消或关闭浏览器后,应立即解锁数据

现在锁定数据库中的数据不是问题,我保留了一个表,其中的数据集被锁定以进行编辑,每当用户试图访问该数据时,就会抛出一个错误。当用户保存或取消时释放数据也不是问题,我只是释放表中的锁

但是,由于在编辑时关闭浏览器时没有与后端交互,因此数据集将无限期地保持锁定状态(我可以使用时间戳和cronjobs等来修复此问题,但这些不是公司基础设施的选项)。我想知道如何解决这个问题


我自己有一个想法,但不知道如何实现,那就是保持客户端和服务器之间的HTTP连接打开,让服务器(laravel)执行一些代码,在连接关闭时释放锁。有什么提示、提示或指针让我从这里继续吗?

使用不带cron job的timestamp字段来指示记录被锁定的时间。如果当前时间晚于时间戳,请考虑记录未锁定。

当web表单打开时,您可以每隔几分钟使用ajax请求在接下来的几分钟内更新此时间戳,从而保持记录锁定


如果用户关闭浏览器窗口,则时间戳字段不会更新,记录将在几分钟内解锁

我们不使用乐观锁定策略肯定是有原因的,因为它根本不是一种锁定,所以更常用乐观锁定策略。当用户需要签出一段数据,而其他人在编辑该数据时不得触摸该数据时,存在几种业务情况。@spencer7593,是,当数据集被其他用户编辑时,用户查看数据集是没有用的,因为它在保存后看起来会完全不同。您是否看到在浏览器窗口关闭后,通过服务器发出关闭连接的信号,然后释放数据,立即将其解锁的可能性?我不知道有任何可能性可靠的跨浏览器方法。