Sql server中的 sp_reset_connection
背景
使用定時(shí)任務(wù)調(diào)度框架quartz.net 3.2.3版本批量刪除作業(yè)的時(shí)候發(fā)現(xiàn)每次只能刪除一個(gè)作業(yè)無法批量刪除,后來就是調(diào)試源碼,然后找到了具體的刪除的tsql語句,調(diào)試的時(shí)候也正常,刪除n個(gè)任務(wù),就會(huì)有n個(gè)刪除command發(fā)送給sql引擎執(zhí)行,看代碼也沒有問題,后來實(shí)在沒辦法,在sql server服務(wù)器上使用sql server profiler嗅探器追蹤實(shí)際執(zhí)行的tsql語句,發(fā)現(xiàn)確實(shí)是有n個(gè)刪除的命令,不是我之前想的是因?yàn)槎嗑€程閉包導(dǎo)致的問題,因?yàn)樽粉櫟降膖sql語句和sql參數(shù)都是正確的,我就更疑惑了,到底問題出在哪里了,后來通過調(diào)試,再刪除一個(gè)任務(wù)后查詢一下數(shù)據(jù)庫表(加上nolock),當(dāng)?shù)趎個(gè)刪除運(yùn)行完后,在下一行代碼打上斷點(diǎn)暫停,然后再查詢一下表(加上nolock)發(fā)現(xiàn)刪除了n個(gè)任務(wù),這時(shí)我就想到是事務(wù)回滾了之前的刪除操作,這時(shí)我再去嗅探器里查看追蹤到的語句,發(fā)現(xiàn)有一個(gè)sp_reset_connection命令,百度搜索一下,發(fā)現(xiàn)這個(gè)命令有回滾的作用,證明了我的猜想是正確的。
存儲(chǔ)過程 sp_reset_connection 作用
一般Sql應(yīng)用程序都會(huì)使用連接池來提高性能,如果有一個(gè)連接在事務(wù)執(zhí)行完后忘記提交事務(wù)應(yīng)用程序就退出連接,那么這個(gè)連接會(huì)被交還給連接池,但是這時(shí)候,事務(wù)不會(huì)被清理,sql客戶端驅(qū)動(dòng)程序會(huì)在這個(gè)連接下一次被重用的時(shí)候先發(fā)送 exec sp_reset_connection? 命令來清理該連接上次遺留下來的所有對(duì)象,包括回滾該連接上次未提交的事務(wù)。