欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

并發(fā)環(huán)境下mysql插入檢查方案

 更新時間:2016年03月04日 17:06:10   投稿:lijiao  
這篇文章主要介紹了并發(fā)環(huán)境下mysql插入檢查方案的相關資料,需要的朋友可以參考下

業(yè)務背景:
基本業(yè)務場景是這樣的,請求數據(車輛vin信息)進入到接口中,需要先判斷其在數據庫中的狀態(tài),如果庫中不存在該vin,或者該vin狀態(tài)位為“1(已完成)”,則執(zhí)行一些檢查操作后,將數據插入到數據庫中,此時新增vin狀態(tài)為0,調用人工處理接口,十分鐘后返回結果,將狀態(tài)置為1。如果其狀態(tài)位為“0(正在處理)”則駁回操作,返回提示信息。
在單線程環(huán)境下,這樣的業(yè)務沒有問題,然而當并發(fā)訪問接口時,會出現(xiàn)同時進入兩條vin相同的請求AB,正常情況應該插入一條A,駁回一條B。然而并發(fā)環(huán)境下,B執(zhí)行檢查狀態(tài)時A還沒有插入,因此AB都進入到了數據庫中,數據就錯誤了。

解決方案一:
首先想到的是使用sql處理,對數據庫對應字段加唯一索引,保證一致性。如果插入重復的數據,則catch該異常,做出提示。

ALTER tableName ADD UNIQUE [indexName] ON (tableColumns(length))

但是由于業(yè)務限制,vin在庫中是可以重復的,多條重復數據查詢最新,所以不能再vin上添加唯一索引。

解決方案二:
使用mysql事務操作,將檢查是否存在和插入作為一個事務進行處理,當檢查失敗的時候,不進行插入。從網上搜索了一下,大致思路如下:

public static void StartTransaction(Connection con, String[] sqls) throws Exception { 
    try { 
      // 事務開始 
      con.setAutoCommit(false);  // 設置連接不自動提交,即用該連接進行的操作都不更新到數據庫 
      sm = con.createStatement(); // 創(chuàng)建Statement對象 

      //依次執(zhí)行傳入的SQL語句 
      for (int i = 0; i < sqls.length; i++) { 
        sm.execute(sqls[i]);// 執(zhí)行添加事物的語句 
      } 
      con.commit();  // 提交給數據庫處理 
      // 事務結束 

    //捕獲執(zhí)行SQL語句組中的異常   
    } catch (SQLException e) { 
      try { 
        System.out.println("事務執(zhí)行失敗,進行回滾!\n"); 
        con.rollback(); // 若前面某條語句出現(xiàn)異常時,進行回滾,取消前面執(zhí)行的所有操作 
      } catch (SQLException e1) { 
        e1.printStackTrace(); 
      } 
    } finally { 
      sm.close(); 
    } 
  }

但是這樣實際上還是沒有解決并發(fā)的問題,這樣只是把兩個操作變成了一個原子的sql操作,可以用于同時插入兩條數據一致性的情況,但并不適合需求。

既然sql層面沒有解決問題,就考慮從java的并發(fā)編程方向解決。
解決方案三:
java解決并發(fā)問題,首先想到的是使用內置鎖或者可重入鎖,基本語法如下:
·內置鎖:
由于是在Servlet中進行的處理,因此使用synchronized(this)直接處理業(yè)務代碼,使得并發(fā)情況下,只能有一個線程訪問到該段業(yè)務代碼:

synchronized(this){
  //todo1:檢查vin是否存在
  //todo2:如果不存在插入vin
}

·可重入鎖:
相當于更靈活的內置鎖,在這里與內置鎖基本相同

public class DashengCallBack extends HttpServlet {
  private static ReentrantLock lock= new ReentrantLock();
  protected void doGet(HttpServletRequest request, HttpServletResponse response){
    lock.lock();
    try{
      //todo1:檢查vin是否存在
      //todo2:如果不存在插入vin
    }finally{
      lock.unlock();
    }
  }
}

經過測試,這個方案是可行的,最終沒有采用的原因是因為直接使用這種方式加鎖,加鎖的代碼太多,影響效率。

解決方案四:
設置一個查詢Map,插入前存儲數據,插入后刪除數據,代碼如下:

    ConcurrentHashMap<String, String> vinMap=new ConcurrentHashMap<String,String>();
    if(vinMap.containsKey(vin)){
      // todo1: vin 請求完畢后, 從vinInRequestMap里刪掉這個vinNo
      // todo2: 返回正在查詢
    }
    vinMap.put(vin, "");
    //todo3:插入vin到數據庫
    vinMap.remove(vin);
  }

這個方案基本滿足了業(yè)務需求,唯一的問題是要求接口的更新時間要與業(yè)務時間錯開,否則更新接口會清空vinMap,導致庫中數據混亂,出現(xiàn)錯誤。

以上就是本文的全部內容,希望對大家的學習有所幫助。

相關文章

  • 解決 phpmyadmin #2002 無法登錄 MySQL 服務器

    解決 phpmyadmin #2002 無法登錄 MySQL 服務器

    我以前使用phpmyadmin都是很正常的,從來沒有出現(xiàn)過問題。但是今天出現(xiàn)了提示#2002無法登陸到MYSQL服務器
    2012-04-04
  • 從mysql讀寫分離著手提升服務器性能

    從mysql讀寫分離著手提升服務器性能

    這篇文章主要為大家介紹了從mysql讀寫分離著手提升服務器性能實現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-05-05
  • Mysql開啟外網訪問的全過程記錄

    Mysql開啟外網訪問的全過程記錄

    mysql 默認是不允許外放訪問的,只允許 localhost 或 127.0.0.1 訪問,下面這篇文章主要給大家介紹了關于Mysql開啟外網訪問的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-05-05
  • 關于Mysql隔離級別、鎖與MVCC介紹

    關于Mysql隔離級別、鎖與MVCC介紹

    本篇文章給大家詳細介紹了一下關于Mysql隔離級別、鎖與MVCC的相關知識,有這方面興趣的朋友參考下。
    2018-01-01
  • Linux安裝MySQL教程(二進制分發(fā)版)

    Linux安裝MySQL教程(二進制分發(fā)版)

    這篇文章主要為大家詳細介紹了Linux安裝MySQL教程,二進制分發(fā)版,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-02-02
  • MySQL的InnoDB存儲引擎的數據頁結構詳解

    MySQL的InnoDB存儲引擎的數據頁結構詳解

    這篇文章主要為大家詳細介紹了MySQL的InnoDB存儲引擎的數據頁結構,,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • mysql 批量修復

    mysql 批量修復

    這篇文章主要介紹了mysql 批量修復,需要的朋友可以參考下
    2016-05-05
  • MySQL的Flush-List和臟頁的落盤機制

    MySQL的Flush-List和臟頁的落盤機制

    這篇文章主要介紹了MySQL的Flush-List和臟頁的落盤機制,幫助大家更好的理解和使用MySQL,感興趣的朋友可以了解下
    2020-11-11
  • mysql最新版8.0.17解壓版安裝教程

    mysql最新版8.0.17解壓版安裝教程

    這篇文章主要為大家詳細介紹了最新版mysql 8.0.17 解壓版安裝教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-09-09
  • mysql8.0忘記密碼的詳細解決方法

    mysql8.0忘記密碼的詳細解決方法

    很早前安裝了MYSQL,現(xiàn)在由于需要使用MYSQL但忘記密碼,所以下面這篇文章主要給大家介紹了關于mysql8.0忘記密碼的詳細解決方法,文中通過圖文介紹的非常詳細,需要的朋友可以參考下
    2022-06-06

最新評論