简体   繁体   中英

Is a single call to ExecuteNonQuery() atomic

Is a single call to ExecuteNonQuery() atomic or does it make sense to use Transactions if there are multiple sql statements in a single DbCommand?

See my example for clarification:

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

If you don't ask for a transaction, you (mostly) don't get one. SQL Server wants everything in transactions and so, by default (with no other transaction management), for each separate statement , SQL Server will create a transaction and automatically commit it. So in your sample (if there was no TransactionScope ), you'll get two separate transactions, both independently committed or rolled back (on error).

(Unless you've turned IMPLICIT_TRANSACTIONS on on that connection, in which case you'll get one transaction but you need an explicit COMMIT or ROLLBACK at the end. The only people I've found using this mode are people porting from Oracle and trying to minimize changes. I wouldn't recommend turning it on for greenfield work because it'll just confuse people used to SQL Server's defaults)

It's not. SQL engine will treat this text as two separate instructions. TransactionScope is required (or any other form of transaction, ie implicit BEGIN TRAN - COMMIT in SQL text if you prefer).

No, as the above answers say the command (as opposed to individual statements within the command) will not be run inside a transaction

Will be easy to verify

Sample code

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();
}

The second statement will fail. But the first statement will execute and you'll have a row in the table.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM