我应该在MySQL中使用自定义的“锁”表吗?

如何解决我应该在MySQL中使用自定义的“锁”表吗?

| 我正在开发一个相对简单的自定义Web应用程序,该应用程序的后端是MysqL MyISAM数据库。我想以某种方式避免经典的并发覆盖问题,例如用户A覆盖用户B \的编辑,因为B在A完成之前加载并提交了一些编辑表单。 这就是为什么我想以某种方式在显示编辑表单时锁定一行。然而... 正如我所说,我正在使用MyISAM,据我所知,它不支持行级锁。另外,我不确定是否建议保持“真实” MysqL锁定几分钟。 我对交易并不是很了解,但是从我所看到的来看,它们似乎应该在一个连接中使用。 使用某种类似Git的冲突合并系统确实不是一种选择。 行将保持锁定状态几分钟。并发性非常低:随时有六十个用户使用该应用程序。 我现在计划使用一个表,其中包含有关哪个用户在做什么以及从什么时候开始的详细信息。然后,该应用可以决定在其他用户最近打开它(例如正在使用它)时不显示该编辑表单。保存表单时,该假锁将被删除。 这行得通吗?我应该怎么做才能避免出现死锁,活锁和其他所有问题?     

解决方法

        您可以实现锁定,最简单的方法可能是在要锁定的数据中添加两个字段(lock_created Datetime,locked_by int)。然后在编辑页面上(可能还有编辑按钮上)检查是否已更新(lock_created + lock_interval)冲突。 有人没有提交他们的数据。如果将锁设置为过期,则无法解决该问题。 (如果您不这样做,则可以永远保留锁。) 您只能确定哪个优先级高(使用Bob所创建的新锁可能最简单),并通知另一个页面已过期,并且数据不会累加,然后将其交还给他们以进行重做。 有关表结构的注释:您可以使用字段“ table_name,row_id,lock_created,locked_by \”创建表“ locks”,但这可能不是最简单的方法,因为联接可变表名很复杂和令人困惑。同样,可能没有用一个位置来存储所有锁。对于简单的机制,我认为向要实现锁定机制的每个表添加统一字段更加容易。     ,        在这种情况下,您绝对不应该使用行级锁。 您可以使用乐观锁定,这基本上意味着每行都有一个版本字段,当保存行时该字段会增加。保存之前,请确保版本字段与加载行时的版本字段相同,这意味着自您读取该行以来,没有其他人保存任何内容。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?