今天有人说C#
connection.BeginTransaction()
与t-sql不同
begin transaction
,所以我测试了一下,结果似乎是真的。
C代码使用
连接.BeginTransaction()
:
using (var connection = Connection)
{
connection.Open();
var cmd = connection.CreateCommand();
cmd.CommandText = "create table #TransactionTest ([ID] int);";
cmd.ExecuteNonQuery();
cmd.CommandText = "insert into #TransactionTest ([ID]) values (1);";
cmd.ExecuteNonQuery();
using (var transaction = connection.BeginTransaction())
{
cmd.CommandText = "insert into #TransactionTest ([ID]) values (1);";
cmd.Transaction = transaction;
cmd.ExecuteNonQuery();
transaction.Rollback();
}
cmd.CommandText = "select count(1) from #TransactionTest";
var count = cmd.ExecuteScalar(); //result : 0 count
}
使用t-sql的c代码
Begin Transaction
:
using (var connection = Connection)
{
connection.Open();
var cmd = connection.CreateCommand();
cmd.CommandText = "create table #TransactionTest ([ID] int);";
cmd.ExecuteNonQuery();
cmd.CommandText = "insert into #TransactionTest ([ID]) values (1);";
cmd.ExecuteNonQuery();
cmd.CommandText = "begin transaction;";
cmd.ExecuteNonQuery();
cmd.CommandText = "insert into #TransactionTest ([ID]) values (1);";
cmd.ExecuteNonQuery();
cmd.CommandText = "rollback;";
cmd.ExecuteNonQuery();
cmd.CommandText = "select count(1) from #TransactionTest";
var count = cmd.ExecuteScalar(); //result : 0 count
}
在我看来,这种逻辑相当于以下SQL:
create table #TransactionTest ([ID] int, [Value] varchar(32));
begin transaction;
insert into #TransactionTest ([ID], [Value])
values (1, 'ABC');
rollback transaction ;
insert into #TransactionTest ([ID])
values (1);
select * from #TransactionTest;
我发现没有使用SQL Server Profiler和C进行优化的开始事务操作#
connection.BeginTransaction
但找到了c sql beginTransaction
问题:
是真的,还是只是隐藏在数据库中?