C# Connection.BeginTransaction()与SQL begin事务不同吗?
今天有人说C connection.BeginTransaction不同于T-SQL的begin事务,所以我测试了它,结果似乎是正确的 使用connection.BeginTransaction的C代码: 使用T-SQL开始事务的C代码: 在我看来,这种逻辑相当于以下SQL:C# Connection.BeginTransaction()与SQL begin事务不同吗?,c#,sql-server,C#,Sql Server,今天有人说C connection.BeginTransaction不同于T-SQL的begin事务,所以我测试了它,结果似乎是正确的 使用connection.BeginTransaction的C代码: 使用T-SQL开始事务的C代码: 在我看来,这种逻辑相当于以下SQL: create table #TransactionTest ([ID] int, [Value] varchar(32)); begin transaction; insert into #Transaction
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探查器调优C connection.BeginTransaction时没有开始事务操作
但是发现了C sql BeginTransaction
问题:
它是真实的,还是只是隐藏在数据库中?由于在.NET中实现事务的方式不同,存在显著差异,尽管在许多情况下,如在您的示例中,它们的行为似乎相同 SQL Server中的事务将根据需要自动升级。 ADO.NET事务将不会被删除。 ADO.NET将不允许并行 事务,即使启用了多个结果集。 ADO.NET 事务绑定到连接对象,这在 但代码很容易让人困惑: 为什么会让人困惑?因为命令对象也绑定到连接,但是连接中的事务并不等同于其命令对象中的事务。 示例:以已启动事务的连接为例,使用它创建一个新命令并尝试执行。除非您显式地将事务提供给新的命令对象,否则它将失败。 就最佳实践而言,我发现以下几点是正确的: 存储过程是在需要事务时避免问题的最佳方法 应该避免在事务中甚至为临时表使用DDL。SQL Server将允许它,但其他数据库(如Oracle)将不允许。
您可以在MS文档中了解更多信息SQL Profiler的默认配置不显示事务。我会看看这个。我选择SQL Profiler tunning模板@Stephen Wrighton,我正在谷歌搜索Transaction Profiler。你需要选中show all events并创建一个新的配置文件模板。这里有一个链接:只需将事务事件直接添加到跟踪中,在Profiler中的事务组下。请注意,客户端API可以直接通过TDS协议管理事务,因此不会执行t-SQL语句。谢谢@Stephen Wrighton您可以回答下面的问题,这就是答案
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
}
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;
var transaction = connection.BeginTransaction()