sqlserver大數批次update時死鎖的問題及解決方案
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- SQLserver 程式被死鎖問題解決SQLServer
- Java 程式死鎖問題原理及解決方案Java
- Sqlserver分析死鎖問題SQLServer
- SQ死鎖及死鎖的解決
- 解決Oracle死鎖問題步驟Oracle
- 解決庫存扣減及訂單建立時防止併發死鎖的問題
- 記憶體混亂及解決方法和死鎖問題記憶體
- 快取三大問題及解決方案快取
- Mysql使用kill命令解決死鎖問題MySql
- 通過 sysprocesses 解決Sql死鎖問題SQL
- Oracle觸發器死鎖問題解決Oracle觸發器
- ORACLE ERP解決死鎖的方案Oracle
- 死鎖檢測及解決
- 記一次 MySQL select for update 死鎖問題MySql
- 解決SQL2005死鎖問題SQL
- 由Oracle觸發器死鎖及行級鎖限制所衍生的解決方案Oracle觸發器
- 快取世界中的三大問題及解決方案快取
- 故障解析丨一次死鎖問題的解決
- SQLServer 如何收集資料以排除 SQL 死鎖問題SQLServer
- mysql慢查詢,死鎖解決方案MySql
- 死鎖問題排查過程-間隙鎖的復現以及解決
- mysql之神奇的死鎖及解決思路MySql
- 手把手教你分析解決MySQL死鎖問題MySql
- SQLServer的死鎖分析(1):頁鎖SQLServer
- 快取過程存在的三大問題及解決方案快取
- 跨域問題及解決方案跨域
- 常見問題及解決方案
- 常見的死鎖情況及解決方法
- Kafka常見的問題及解決方案Kafka
- MySQL併發時經典常見的死鎖原因及解決方法MySql
- MySQL死鎖問題MySql
- Python | 多執行緒死鎖問題的巧妙解決方法Python執行緒
- 最近解決了一個比較複雜的“死鎖”問題
- MySQL 死鎖解決MySql
- MySQL解決死鎖MySql
- WordPress:常見問題及解決方案
- sql server死鎖的問題SQLServer
- ORA-00060死鎖的產生及解決