C# 进行小型分析时.NET事务在Sql Server数据库上的工作方式

C# 进行小型分析时.NET事务在Sql Server数据库上的工作方式,c#,.net,database,transactions,C#,.net,Database,Transactions,我做了一个简单的测试来了解事务在.net中是如何工作的 对其执行事务测试的示例代码如下 _sqlHelper = new SqlHelper(true); try { _sqlHelper.ExecuteNonQuery(SpName.sp_UpdateRoomStatus.ToString() , Parameters.SqlParam<int?>("DepartmentId", this.DepartmentId, SqlDbType.Int)

我做了一个简单的测试来了解事务在.net中是如何工作的

对其执行事务测试的示例代码如下

_sqlHelper = new SqlHelper(true);
try
{
    _sqlHelper.ExecuteNonQuery(SpName.sp_UpdateRoomStatus.ToString()
        , Parameters.SqlParam<int?>("DepartmentId", this.DepartmentId, SqlDbType.Int)
        );

    _sqlHelper.ExecuteNonQuery(SpName.sp_UpdateRoomStatus.ToString()
        , Parameters.SqlParam<int?>("DepartmentId", this.DepartmentId, SqlDbType.Int)
        );

    _sqlHelper.CommitTransaction();
}
catch (SqlHelperException ex)
{
    _sqlHelper.RollBackTransaction();
}
\u sqlHelper=newsqlhelper(true);
尝试
{
_sqlHelper.ExecuteNonQuery(SpName.sp_UpdateRoomStatus.ToString()
,Parameters.SqlParam(“DepartmentId”,this.DepartmentId,SqlDbType.Int)
);
_sqlHelper.ExecuteNonQuery(SpName.sp_UpdateRoomStatus.ToString()
,Parameters.SqlParam(“DepartmentId”,this.DepartmentId,SqlDbType.Int)
);
_sqlHelper.CommitTransaction();
}
catch(SqlHelperException-ex)
{
_sqlHelper.RollBackTransaction();
}
测试说明

当我编写新的SqlHelper时(true);一个新的事务在内部启动,并已创建连接并打开到数据库

_sqlHelper.ExecuteNonQuery(SpName.sp_UpdateRoomStatus.ToString()
    , Parameters.SqlParam<int?>("DepartmentId", this.DepartmentId, SqlDbType.Int)
    );
\u sqlHelper.ExecuteNonQuery(SpName.sp\u UpdateRoomStatus.ToString()
,Parameters.SqlParam(“DepartmentId”,this.DepartmentId,SqlDbType.Int)
);
现在,上面的函数执行我的过程并在数据库中进行更改

我编写了两次相同的函数调用来执行两次过程。此过程在数据库中执行插入操作。此过程在3个不同的表中包含3个insert查询。 现在我在两个函数调用上都标记了断点

一旦控件到达第一个断点,我就让它的处理完成,这意味着第一个过程已经完成了插入

现在我拔掉了我的局域网电线,因为DB在远程系统上。这意味着连接丢失。因此,需要回滚事务

现在当我验证数据库的整个过程完成后。我发现数据处于一致状态,因此证明了事务正在工作

我现在很困惑,从第一次过程调用开始,实际的插入发生在哪里,因为过程成功地执行了sql server如何得到事务正在进行和必须进行回滚的通知。

似乎是建立了到数据库的连接,通知该连接包含事务,并且在连接丢失时应该回滚


因此,还声明所做的更改是在数据库而不是.net环境中维护的。

数据库知道连接和更改应该在事务中-实际更改和原始数据存储在数据库事务日志中。当事务未正确提交且连接丢失时,数据库会自动回滚该事务


基本上,在SqlTransactions(非分布式).Net中,它没有做任何聪明的事情,它都是由数据库处理的。

数据库知道连接和更改应该在事务中-实际更改和原始数据存储在数据库事务日志中。当事务未正确提交且连接丢失时,数据库会自动回滚该事务


基本上,在SqlTransactions(非分布式).Net中,没有什么聪明的地方,它都是由数据库处理的。

但是数据库如何知道队列中还有更多的查询要执行呢。所有的查询都是原子的。到数据库的连接是否始终被视为一个事务?它不知道还有其他事务,它只知道没有调用COMMIT命令,因此自事务开始以来的任何内容都应该回滚。但是谁在调用COMMIT命令呢。当事务开始和提交时,并没有人通知数据库,除非我们明确指定了事务,否则每个查询都被视为一个单独的事务,所以数据库为什么会知道完整的批处理必须被视为一个事务。因此,调用提交您的问题说明SqlHelper启动了一个事务(当事务启动时,会通知数据库),并且您的代码列表在
try
部分结束之前显式调用Commit。@ck:这是否意味着每当创建到数据库的连接时。net都会通知DB当前连接正在事务中。因此,sql server中也存在一些技术来创建特定于事务的连接,但数据库如何知道队列中还有更多的查询要执行呢。所有的查询都是原子的。到数据库的连接是否始终被视为一个事务?它不知道还有其他事务,它只知道没有调用COMMIT命令,因此自事务开始以来的任何内容都应该回滚。但是谁在调用COMMIT命令呢。当事务开始和提交时,并没有人通知数据库,除非我们明确指定了事务,否则每个查询都被视为一个单独的事务,所以数据库为什么会知道完整的批处理必须被视为一个事务。因此,调用提交您的问题说明SqlHelper启动了一个事务(当事务启动时,会通知数据库),并且您的代码列表在
try
部分结束之前显式调用Commit。@ck:这是否意味着每当创建到数据库的连接时。net都会通知DB当前连接正在事务中。因此,sql server中也存在一些技术来创建特定于事务的连接。