sqlserver大數批次update時死鎖的問題及解決方案

zenzuguo發表於2007-09-26
大資料量sqlserver 出現併發死鎖

UPDATE recruit_allocate SET remark ='學生的學籍號與姓名不匹配',flag = 1
WHERE unitivecode IS NOT NULL AND len(unitivecode)>0
AND NOT EXISTS(SELECT 1 FROM student_info WHERE stuname = recruit_allocate.stuname AND unitivecode = recruit_allocate.unitivecode)
AND is_allocate = 0
AND section = 2
AND operateguid = '516E1637-7895-4020-A8FD-73353AD4B5B3'
AND rst_subject_id = '80EB6C0B-C506-4556-9A05-4C191970D7A5


我這種寫法不能併發
因為裡面有個exists子句
訪問的是張大表
併發以後死鎖,資料量非常大
student_info裡130萬條

recruit_allocate裡有10萬條
update上條件上都建立了索引,並且有主鍵.
解決辦法:

synchronized (this) {
getJdbcTemplate().update(sqlBuf.toString());
}

對每條類似的update語句,在執行時加上synchronized,就可以併發了,並且速度還挺快的。但是要保證每個update執行的速度比較快,至少在5s左右

事務不能太大,在保證邏輯執行正常的情況盡,儘量讓事務小一些, 同時在執行對同一張表的相同的update語句(只是條件中的值不同)時的時候,不能併發,對同一張表的,不同的update語句間是可以併發的,

還有種說法是:對同表的不同行併發操作是沒有問題的,對同一行併發是不行的

[@more@]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/106285/viewspace-972490/,如需轉載,請註明出處,否則將追究法律責任。

相關文章