为啥 SELECT 在 SQL Server 中创建未提交的事务?

Posted

技术标签:

【中文标题】为啥 SELECT 在 SQL Server 中创建未提交的事务?【英文标题】:Why is SELECT creating an uncommitted transaction in SQL Server?为什么 SELECT 在 SQL Server 中创建未提交的事务? 【发布时间】:2018-09-19 04:09:36 【问题描述】:

我在 SSMS 中禁用了自动提交。 我今天一直在玩它,经过一些奇怪的(无论如何对我而言)行为将用例缩小到以下范围:

连接到数据库 打开一个新的查询(ctrl n)

发出一个简单的 SELECT 语句,例如

从 AdventureWorks2017.Person.Person 中选择 TOP (5) *

关闭窗口

我在对话框(对话,嗯)框中收到以下消息:

There are uncommitted transactions. Do you wish to commit these transactions before closing the window?

作为 Oracle 的老用户,我知道 Oracle 和 SS 在锁定方面存在差异,但selects 导致需要提交或回滚的未完成事务?真的吗?这不可能,当然。没有数据发生变化。请问有人能解释一下吗?提前致谢。

【问题讨论】:

【参考方案1】:

当您使用控制台时,它会自动将您的查询放入事务中。因为您还没有关闭在您开始运行任何类型的查询时它自动启动的事务,所以您仍然有一个事务处于打开状态。

这篇 MSDN 文章对此进行了一些讨论。 https://docs.microsoft.com/en-us/sql/t-sql/statements/set-implicit-transactions-transact-sql

【讨论】:

有点。过去跟踪所有这些的一个好方法是打开 SQL 分析器并观察所有事件并查看幕后发生的事情。 您可以在选择之前和之后执行 Print @@TRANCOUNT 并查看值是多少。根据文档,如果 trancount > 0 它不会创建另一个 Begin Trans...但是您在示例评论中的第一条语句会。 哦,没有看到你的第二个问题埋在那里。我记得,除非您明确打开第二个事务,否则您不会有两个事务。您通常每个窗口都有一个。我个人通常在 SSMS 中启用自动提交,因为在很多时候回滚事务相当容易,而且我更像是开发人员而不是 DBA。处理实时数据是为了像我现在这样的大胡子。 @JL_SO,你问的是不可能的,选择语句的自动提交和数据修改的 IMPLICT_TRANSACTIONS ON。请注意,与 Oracle 不同,SQL Server 允许在事务中进行 DDL,因此 CREATE 将启动 IMPLICT_TRANSACTIONS ON 的事务。 有多个并发级别。我相信 SNAPSHOT_ISOLATION 更接近您习惯使用 Oracle 的方式。

以上是关于为啥 SELECT 在 SQL Server 中创建未提交的事务?的主要内容,如果未能解决你的问题,请参考以下文章

使用 SELECT ... INTO 在 SQL Server 中创建表

sql server 中创建架构,架构是干啥用的,为啥要创建架构,有啥好处?

为啥 SQL Server 会改变操作顺序和装箱方式?

为啥 SQL Server 2000 将 SELECT test.* 和 SELECT t.est.* 视为相同?

为啥 COUNT(*) 需要对 SQL Server 上的所有表列具有 SELECT 权限?

SQL Server:为啥不区分大小写的列上的 SELECT 比区分大小写的列更快?