【问题标题】:Concurrent Conflicting statements with db与 db 并发冲突语句
【发布时间】:2017-06-22 05:36:50
【问题描述】:

我正在尝试创建一个同时向数据库发送修改和选择查询的网站(使用 html、javascript 和 jsp)。 MySQL 显然不喜欢这样(ConcurrectModificationExceptions 无处不在)。

我想创建一个并发接收sql语句的东西,然后根据一些属性将它们排序到一个队列中,然后在确保它们不相互矛盾之后,一个一个地执行队列其他(删除表之后的插入语句会矛盾)。

问题是我不确定如何检查两个语句是否冲突。我的想法是检查表理论上如果语句被执行(通过在重复的表上运行它们)会是什么样子,然后如果抛出错误,则语句与另一个语句冲突。但这意味着我必须多次复制表格,而且我非常怀疑它会起作用。

那么,如何检查两个语句是否冲突?

例如:

String sql1 = "DELETE FROM users WHERE id=3625036";
String sql2 = "UPDATE users SET displayName=\\"FOO\\" WHERE id=3625036";

如果这两个被同时接收然后以某种方式排序,那么sql2 可能会在sql1 之后执行,这将引发异常。如何检查给定示例中的冲突?

【问题讨论】:

  • 如果你允许并发修改,你就打开了竞争条件的大门。学生有并发编程的背景吗?或者是关于教授并发编程的课程(显然不是,或者你不会问这个问题)?否则我认为你绝对想要一个强制独占访问的数据库。
  • @Gilles 我不确定我为什么想要这样一个数据库...
  • 如果多个会话同时进行查询,那么学生必须注意竞争条件。 process_page () { open_session(); do_my_stuff(); close_session(); write(reply); } 很容易教。编写无竞争的代码要困难得多。如果数据库允许并发会话,您将把全部时间都花在并发问题上(为什么select(); update(); 会中断一半时间???)。如果这是课程的目的,那很好,但从你的问题来看,我认为这不是重点。
  • 请分享更多细节,哪个数据库,什么事务隔离级别等?
  • @MarkRotteveel 什么数据库?

标签: java database jdbc concurrency


【解决方案1】:

MySQL 与所有完整的数据库系统一样,在正常的事务和锁定限制范围内支持大量并发操作。您最好通过询问堆栈溢出问题来解决您的特定问题。

我认为您不应该让学生管理排队等任务。您所描述的内容的复杂性很重要,更重要的是,这就是数据库系统的用途。当他们可以利用比他们可以建造的东西更好的东西时,应该教导他们不要重新发明轮子。除非您特别想教授这种低级数据库构造。

【讨论】:

    【解决方案2】:

    应该是mysql的驱动问题尝试更新mysql驱动。 另一种解决方法是在您的代码中实现表级同步。

    示例:

    class UserDAO{
    
    public void upateUsers(String sql){
       synchronized(UserDAO.class){
        // do update operations
       }
    }
    
    public void deleteUser(String sql){
       synchronized(UserDAO.class){
        // do delete operations
       }
    }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-27
      • 1970-01-01
      • 1970-01-01
      • 2021-02-10
      • 1970-01-01
      • 2012-10-23
      • 1970-01-01
      相关资源
      最近更新 更多