mysql高并發(fā)update死鎖 MySQL死鎖套路之唯一索引下批量插入順序不一致?
MySQL死鎖套路之唯一索引下批量插入順序不一致?這個代碼,只要滿足條件,肯定會死鎖。R如果兩個線程同時進行批更新,則第一個線程用id=1更新數(shù)據(jù),第二個線程用id=2更新數(shù)據(jù)。R此時,第一個線程準備
MySQL死鎖套路之唯一索引下批量插入順序不一致?
這個代碼,只要滿足條件,肯定會死鎖。R如果兩個線程同時進行批更新,則第一個線程用id=1更新數(shù)據(jù),第二個線程用id=2更新數(shù)據(jù)。R此時,第一個線程準備更新id=2的數(shù)據(jù),但是線程2持有的連接沒有提交,因此無法獲得數(shù)據(jù)庫中id=2的行鎖。同時,第二個線程準備更新id=1的數(shù)據(jù)。因為無法獲得id=1的行鎖,所以會導致死鎖。R解決方法是:如果條件被更新,比如主鍵,則根據(jù)主鍵排序后批量更新。R如果更新條件不是主鍵,則可以由單個線程處理。R還可以通過執(zhí)行一條語句來避免死鎖。但是,使用批處理性能太低,您還需要結(jié)合您的業(yè)務調(diào)整代碼以避免死鎖
當多個網(wǎng)絡用戶同時讀取同一個數(shù)據(jù)庫表時,不會發(fā)生沖突。只有當一個部分讀取另一個部分或每個人都必須編寫數(shù)據(jù)庫時,才會發(fā)生沖突。數(shù)據(jù)庫執(zhí)行并發(fā)操作,即微操作為串行操作,宏操作為并行操作。MySQL是一個支持多事務處理的網(wǎng)絡數(shù)據(jù)庫。為了保證數(shù)據(jù)庫的一致性,在訪問數(shù)據(jù)庫時必須合理使用互斥機制。
很容易理解這種機制。常用鎖包括共享鎖,即讀鎖、排他鎖,即寫鎖和更新鎖,即更新操作期間添加的鎖,也可以分類為寫鎖。如果已添加讀鎖,請不要添加寫鎖以防止數(shù)據(jù)不一致。如果存在寫鎖,請不要添加寫鎖以防止數(shù)據(jù)庫死鎖。