台灣最大程式設計社群網站
線上人數
803
 
會員總數:245973
討論主題:189551
歡迎您免費加入會員
討論區列表 >> MySQL >> 如何處理 一次多筆資料 新增不重覆 避免併發的問題
[]  
[我要回覆]
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
如何處理 一次多筆資料 新增不重覆 避免併發的問題
價值 : 500 QP  點閱數:706 回應數:16
樓主

暗黑
初學者
50 34
1335 127
發送站內信

MYsQL 版本:10
MYsQL 類型: MariaDB
PHP 版本:7.1.33

各位先進,我是個PHP新手,懇請幫忙一下,整理思路
找了整整一天的資料,愈看愈亂

前提 是這樣的
我有一個資料表,要一次新增 多筆資料(沒辨法設 主鍵,比對資料 需由 多欄位組成)
,但在新增前 需確定 這些資料 是不是重覆的,有重覆資料 則 回傳重覆的資料,不重覆 則新增資料

目前我的流程是
一次多筆查詢(Select Union Select) >> 重覆 則 回傳 ( echo json_encode($result, JSON_UNESCAPED_UNICODE); return; )
>> 沒有重覆 則 新增 (INSERT INTO market_po c1,c2 VALUES ('C1','C2'),('C3','C4') )
以上 基本上流程沒有問題

考慮到併發,我就亂了,網路上查到基本上 兩類解決方式
1-可以用 INSERT INTO Table FROM DUAL WHERE NOT EXISTS(SELECT)>>可是查到的資料,都是單筆的,
問1:是沒有一次寫入的嗎?
問2:是要用迴圈路跑嗎?
問3:這樣,真沒有併發的問題嗎?效率的問題嗎?

2-可以用 鎖; 什麼表、行鎖、共享鎖...,然後 又會 死鎖...,然後又說 基本上 會自動上鎖
問1:會自動上鎖,那應該沒有併發的問題,怎會有這麼多討論呢?
問2:我的狀況,應該是加上表鎖(因為沒主鍵),那應該加在那? 查詢前 還是 新增前
問3:查詢前就鎖,會有什麼 延伸問題? 我又應該如何鎖?
問4:多人連線,是如何區分先後順序??

3-有其他方式解決嗎?
4.還是 併發是我多想的,MYSQL已經自動決解了

因問題比較多,點數我設高一點,來感謝 先進的幫忙; 謝謝





搜尋相關Tags的文章: [ 多筆新增 ] , [ 多筆查詢 ] , [ 併發 ] , [ 鎖 ] ,
本篇文章發表於2020-04-10 23:47
16樓
作者回應

暗黑
檢舉此回應
測試出來的 結果

mysqli_query($con, "start transaction");//開啟 事務
mysqli_query($con, "SAVEPOINT ins_1_1");//設置 回滾點

$tmp = null;
$tmp = mysqli_query($con, $DB_DO_Sel);//查詢 位格 是否強踫
if(mysqli_num_rows($tmp) > 0){//有強踫
if( empty($resultData )){//第一次 組成 app 識別參數
if( $PoType == "Main") $response["Market_PoNo"] = "MainRepeat"; //主格強踫 識別參數
if( $PoType == "Take") $response["Market_PoNo"] = "TakeRepeat"; //帶天強踫 識別參數
$response["TakeNo"] = "0";
$output[] = $response;//組成陣列
}

while($r = mysqli_fetch_assoc($tmp)) $output[] = $r;//組成陣列
$resultData = $output;//組成 回傳資訊

}else {//沒有強踫
if( mysqli_query($con, $DB_DO_Ins) ){//新增資料
mysqli_query($con, "COMMIT");//提交事務
}else{
mysqli_query($con, "ROLLBACK");//異常 回滾
}
}
本篇文章回覆於2020-04-15 00:33
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   

回覆
如要回應,請先登入.