【发布时间】:2010-11-07 11:06:06
【问题描述】:
当我执行一个选择/插入查询时,SQL Server 是否会自动创建一个隐式事务并因此将其视为一个原子操作?
如果表中不存在值,请执行以下查询:
INSERT INTO Table1 (FieldA)
SELECT 'newvalue'
WHERE NOT EXISTS (Select * FROM Table1 where FieldA='newvalue')
如果我没有明确地将“newvalue”包含在事务中,那么在评估 WHERE 子句和执行 INSERT 子句之间,是否有可能被另一个用户插入到表中?
【问题讨论】:
-
FieldA 是否(或为什么不使)成为具有唯一属性的关键字段?似乎是避免重复的好方法,这似乎是您正在寻找的。span>
-
无法详细说明,但由于复杂的原因,我无法直接向数据库添加约束(因此我对这种类型的查询进行了解决)。
-
好吧.. 只是这样我看起来不会太脑残。我将提供一点背景。数据库由第 3 方产品控制/拥有,我正在通过他们的 API 查询该产品,该 API 构建了执行的实际 SQL。它不支持事务和修改其数据库的对象可能会使保修失效。 =)
-
选择/插入操作可能是原子操作的一个明显指标是断点包括整个语句。
-
Autocommit mode 是 SQL Server 数据库引擎的默认事务管理模式。每个 Transact-SQL 语句在完成时都会提交或回滚。如果语句成功完成,则提交;如果遇到任何错误,则回滚。只要此默认模式未被显式或隐式事务覆盖,与数据库引擎实例的连接就会在自动提交模式下运行。自动提交模式也是 ADO、OLE DB、ODBC 和 DB-Library 的默认模式。
标签: sql-server tsql transactions