【发布时间】:2012-03-08 06:52:08
【问题描述】:
我目前正在规划一个运行线程池的 Java 服务器,该线程池接受需要进行数据库读取/更新的客户端连接。
在单行上进行多次读取/写入的情况如何?我应该如何管理这个?我应该在 Java 中创建一个队列还是 MySQL 可以处理这种事情?
例如我计划使用事务,我将使用以下内容来锁定一行:
Select <columns> from <table> where <condition> FOR UPDATE;
问题:如果另一个线程进来并想在第一次提交之前更新同一行怎么办?查询会失败还是 MySQL 会保持一段时间并等待第一个锁被释放?
我当前的解决方案:我正在考虑一种方法,可以创建一个包含所有查询的静态队列/管道,以便一次只将一个查询馈送到数据库。这显然是一个瓶颈和一般的坏主意?
另外,是否有任何 Java 框架可以处理这种事情和一般的 MySQL 连接?谢谢。
编辑:我计划使用线程池,因此所有查询都来自单独的连接。
【问题讨论】:
-
线程是共享一个数据库连接,还是每个线程都有自己的?如果它们是共享的,服务器端锁定将不起作用,因为 MySQL 无法判断它是两个不同的线程在同一个链接上敲击。
-
在回答之前,必须更好地了解您想要完成的任务:您是否希望线程在同一行排队?为什么要在 SELECT 时锁定行而不是在有效更新时创建锁定?为什么要放弃乐观锁定方法?
-
我要使用连接池,所以分开连接。
-
@AlessandroSantini 我不知道是否希望线程排队。不确定是否需要。如果我想在更新之前获取用户帐户余额,那么 SELECT FOR UPDATE 方法是一个好方法吗?
-
我认为这是您首先需要弄清楚的。如果您可能有多个线程同时更新同一个帐户,并且您希望确保所有更新都以先到先得的方式执行,那么 SELECT FOR UPDATE 可能就是您正在寻找的。相反,如果多个线程访问同一个帐户可能会引发错误情况(例如,来自显示过时帐户余额的用户界面的更新),则版本列可能更有效。
标签: java mysql multithreading jdbc