【发布时间】: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