線程池分頁更新數據時一次更新不完

在實際的使用過程中,先在main方法中查出update_flag=1的數據總量,然後對數據進行分頁,即在循環中,創建建立線程池,給每個線程分配對應的頁數和數量,但是如果資源類中會更新update_flag爲0時,會導致運行代碼一次,update=1的數據運行不完,是因爲線程之間讀到了讀已提交的數據,此時傳遞兩個連接給資源類,一個連接用來更新數據,另外一個連接用來查詢數據。

 

//修改前
      for (int i = 0;i <= page;i++){
          Object update = new Object(1000,i*1000,connection);
          newFixedThreadPool.execute(update);
      }

//修改後
      for (int i = 0;i <= page;i++){
          Object update = new Object(1000,i*1000,connectionSelect,connectionUpdate);
          newFixedThreadPool.execute(update);
      }

該問題是數據庫事務導致,在數據庫中,事務具有原子性,要麼完全執行,要麼完全不執行。在上述查詢update_flag=1的數據進行更新時,先select,然後update,然後select,再update,反覆循環,如果只傳入一個數據庫連接,因爲所以的操作都是在一個數據庫連接中,並不能保證事務的隔離性,當update執行成功後,再select能查詢到前面update的數據;但是如果傳入兩個連接,並關閉事務的自動提交,另外一個事務則不能select到這個update的數據,因爲update的數據還沒有提交,只在該事務中有效。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章