上善若水
          In general the OO style is to use a lot of little objects with a lot of little methods that give us a lot of plug points for overriding and variation. To do is to be -Nietzsche, To bei is to do -Kant, Do be do be do -Sinatra
          posts - 146,comments - 147,trackbacks - 0
          因為項目的數據更新頻率很高,導致經常出現死鎖的問題。感覺以下遇到的一種情況比較典型,也比較tricky,計之。

          問題描述:
          如以下兩條非常簡單的SQL語句,它們共同組成了一個Transaction,那么在多線程高頻率執行時就會引起死鎖問題(當然這里要考慮鎖的級別問題,一般多類似這種系統都會選擇行鎖,那么以下引起死鎖的條件是兩條語句都對同一行操作):
          select <column1> from <table> where <column2> = ? 
          update <table> set <column1> = %d where <column2> = '%s'

          問題分析:
          select語句需要“Shared Lock”,因而多個線程可以同時進入,而update需要“Exclusive Lock”,當兩個線程同時執行了select語句,而獲得了“Shared Lock”,而他們在接下來執行update語句時,都需要獲得“Exclusive Lock”而產生競爭,導致死鎖。

          解決方案1:
          互換他們的順序,這樣,在第一次執行update語句時,他們會競爭"Exclusive Lock"而引起沒有得到“Exclusive Lock”的線程等待:
          1, update <table> set <column2> = <column2> + <some value> where <column1> = '%s' 
          2. select <column1> from <table> where <column2> = ? 
          3. <column1> - <some value> to get the old <column1> value.

          解決方案2:
          采用“Hold Lock”方式,即在所有操作之前做一個dummy的update操作,這樣可以保證在進Transaction之前需要先獲得一個“Exclusive Lock”

           

          posted on 2013-10-17 20:49 DLevin 閱讀(4362) 評論(1)  編輯  收藏 所屬分類: Database

          FeedBack:
          # re: Transaction中SQL的順序引起的死鎖
          2013-10-22 06:04 | Jacklondon
          主站蜘蛛池模板: 望谟县| 郧西县| 运城市| 绩溪县| 离岛区| 玉山县| 双江| 剑阁县| 德惠市| 福贡县| 香港 | 台南县| 三门县| 乌鲁木齐县| 蓝山县| 宜宾市| 安顺市| 东源县| 廉江市| 偃师市| 和顺县| 阿勒泰市| 麻阳| 洛宁县| 乌兰察布市| 库伦旗| 百色市| 松阳县| 绥江县| 齐齐哈尔市| 富蕴县| 淮安市| 宣汉县| 四平市| 东明县| 富平县| 沈阳市| 瑞昌市| 新郑市| 仙桃市| 青海省|