今天有人说C#connection.BeginTransaction()
与T-SQL的begin transaction
不同,所以我对其进行了测试,结果似乎是正确的。
使用connection.BeginTransaction()
的C#代码:
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 Begin Transaction
的C#代码:
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
问题:
它是真实的,还是只是隐藏在数据库中?
答案 0 :(得分:1)
由于在.NET中实现事务的方式存在很大差异,尽管在许多情况下(例如您的示例中),它们似乎起着相同的作用。
var transaction = connection.BeginTransaction()
根据最佳做法,我发现以下情况是正确的:
您可以在MS文档here.
中了解更多信息。