对 ExecuteNonQuery() 的单个调用是原子的

Is a single call to ExecuteNonQuery() atomic

如果单个 DbCommand 中有多个 sql 语句,则对 ExecuteNonQuery() 的单个调用是原子的还是使用事务有意义?

请参阅我的示例进行说明:

using (var ts = new TransactionScope())
{
    using (DbCommand lCmd = pConnection.CreateCommand())
    {
        lCmd.CommandText = @"
            DELETE FROM ...;
            INSERT INTO ...";
      lCmd.ExecuteNonQuery();
    }
    ts.Complete();
}

如果您不要求交易,您(大部分)就不会得到交易。 SQL 服务器需要事务中的所有内容,因此默认情况下(没有其他事务管理),对于每个单独的 语句 ,SQL 服务器将创建一个事务并自动提交它。因此,在您的示例中(如果没有 TransactionScope),您将获得两个单独的事务,均独立提交或回滚(出错)。

(除非您已在该连接上打开 IMPLICIT_TRANSACTIONS,在这种情况下,您将获得一笔交易,但最后需要明确的 COMMITROLLBACK。我发现唯一使用此模式的人是从 Oracle 移植并试图尽量减少更改的人。我不建议为未开发的工作打开它,因为它只会让习惯于 SQL 服务器默认设置的人感到困惑)

不是。 SQL 引擎会将此文本视为两个单独的指令。 TransactionScope 是必需的(或任何其他形式的交易,即如果您愿意,在 SQL 文本中隐式 BEGIN TRAN-COMMIT)。

不,正如上面的答案所说的那样,命令(与命令中的单个语句相反)不会 运行 在事务中

将很容易验证

示例代码

create table t1
(
    Id int not null,
    Name text
)


using (var conn = new SqlConnection(...))
using (var cmd = conn.CreateCommand())
{
    cmd.CommandText = @"
         insert into t1 values (1, 'abc');
         insert into t1 values (null, 'pqr');
    ";
    cmd.ExecuteNonQuery();
}

第二个语句将失败。但是第一个语句将执行,你将在 table.

中有一行