【问题标题】:Executing an SQLCommand without specifying a Transaction在不指定事务的情况下执行 SQLCommand
【发布时间】:2010-11-04 06:13:20
【问题描述】:
我们的应用程序通过 SqlCommand 在 SQL Server 数据库上执行 SELECT 查询获取了一些数据列表。我们没有在 SqlCommand 上显式设置事务,而只是将 SqlConnection 传递给它并运行它。是不是在没有指定事务时,SQL Server 会启动并使用默认 IsolationLevel 为ReadCommitted 的默认事务?
【问题讨论】:
标签:
sql-server
transactions
sqlcommand
【解决方案1】:
SQL 为您的语句隐式创建一个事务,并在语句完成时提交该事务。此事务的隔离级别将是当前的隔离级别,默认为 READ COMMITTED。某些语句会覆盖当前的隔离级别并强制执行 READ COMMITTED(例如 RECEIVE)。
如果您的 SqlCommand 执行批处理(更多语句),则访问表的每个语句都将创建自己的事务。
默认的autocommit of transactions 是通过更改 SET IMPLICIT_TRANSACTION ON 来控制的。
更多详情请见Controlling Transactions。
【解决方案2】:
SQL Server 可以在没有显式事务的情况下愉快地工作。但是,是的,我相信它本质上是已提交的(当然,除非您向查询对象添加额外的提示,例如 UPDLOCK / NOLOCK)。您可以通过以下方式对此进行调查:
DBCC USEROPTIONS
其中显示(除其他外):
isolation level read committed