Sql server中的 sp_reset_connection

背景

使用定时任务调度框架quartz.net 3.2.3版本批量删除作业的时候发现每次只能删除一个作业无法批量删除,后来就是调试源码,然后找到了具体的删除的tsql语句,调试的时候也正常,删除n个任务,就会有n个删除command发送给sql引擎执行,看代码也没有问题,后来实在没办法,在sql server服务器上使用sql server profiler嗅探器追踪实际执行的tsql语句,发现确实是有n个删除的命令,不是我之前想的是因为多线程闭包导致的问题,因为追踪到的tsql语句和sql参数都是正确的,我就更疑惑了,到底问题出在哪里了,后来通过调试,再删除一个任务后查询一下数据库表(加上nolock),当第n个删除运行完后,在下一行代码打上断点暂停,然后再查询一下表(加上nolock)发现删除了n个任务,这时我就想到是事务回滚了之前的删除操作,这时我再去嗅探器里查看追踪到的语句,发现有一个sp_reset_connection命令,百度搜索一下,发现这个命令有回滚的作用,证明了我的猜想是正确的。

 

存储过程 sp_reset_connection 作用

一般Sql应用程序都会使用连接池来提高性能,如果有一个连接在事务执行完后忘记提交事务应用程序就退出连接,那么这个连接会被交还给连接池,但是这时候,事务不会被清理,sql客户端驱动程序会在这个连接下一次被重用的时候先发送 exec sp_reset_connection  命令来清理该连接上次遗留下来的所有对象,包括回滚该连接上次未提交的事务。

posted @ 2021-01-08 23:13  温故纳新  阅读(1293)  评论(0编辑  收藏  举报