【问题标题】:How do I block a query thread when another thread is updating the database?当另一个线程正在更新数据库时,如何阻止查询线程?
【发布时间】:2013-11-05 03:56:26
【问题描述】:

我有一个服务器,它为每个连接到服务器的用户创建一个子线程。子服务器类有 run 方法和其他方法。

一种方法使用 select 搜索 mysql 数据库。

另一种方法更新数据库。

当另一个线程使用更新数据库的方法时,如何阻止搜索数据库的方法?

【问题讨论】:

  • 当另一个线程使用更新数据库的方法时,客户端似乎会不高兴等待搜索数据库的方法
  • 您问这个是因为查询正在提取部分更新结果还是出于其他原因?

标签: java multithreading sync


【解决方案1】:

处理您的需求的正确方法是在一个事务中执行所有数据库操作。这将避免数据库代码相互排斥的任何需要,并且还将保证您的 Java 进程与任何其他执行其自己操作的数据库客户端之间的隔离。

【讨论】:

    【解决方案2】:

    最好的方法是数据库事务和正确的isolation 级别。

    以下是MySql中的一些隔离级别:

    读取未提交

    读取已提交

    可重复读取

    可序列化

    【讨论】:

      【解决方案3】:

      不确定你是否有一个好的设计这样做,但如果你想在方法上使用互斥锁,请将方法声明为同步

      public synchronized void putInDbase(String value) {
        //only one thread will execute here at a time
      }
      

      但是如果你在同一个类中有两个单独的方法,你想同步处理数据库的实际代码,你可以做同步块

      public class myDbase {
           public void search() {
      
          synchronized(this) {
           //database code
          }
      
      }
      
      public void update() {
      
         synchronized(this) {
            //database code
         }
      
      }
      
      }
      

      【讨论】:

      猜你喜欢
      • 2015-02-18
      • 2017-09-09
      • 2019-02-12
      • 1970-01-01
      • 2021-11-22
      • 1970-01-01
      • 2015-09-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多