对 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
,在这种情况下,您将获得一笔交易,但最后需要明确的 COMMIT
或 ROLLBACK
。我发现唯一使用此模式的人是从 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.
中有一行
如果单个 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
,在这种情况下,您将获得一笔交易,但最后需要明确的 COMMIT
或 ROLLBACK
。我发现唯一使用此模式的人是从 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.
中有一行