Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Connection.BeginTransaction()与SQL begin事务不同吗?_C#_Sql Server - Fatal编程技术网

C# Connection.BeginTransaction()与SQL begin事务不同吗?

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

今天有人说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 #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()