与db

时间:2017-06-22 05:36:50

标签: java database jdbc concurrency

我正在尝试创建一个网站(使用html,javascript和jsp),同时向db发送修改和选择查询。 MySQL显然不喜欢(ConcurrectModificationException无处不在)。

我想创建一些接收sql语句并发的东西,然后根据某些属性将它们命令到一个队列中,然后在确保它们没有完成后逐个执行队列相互矛盾(删除表后的插入语句会发生矛盾)。

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

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

例如:

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

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

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

应该是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
   }
}

}