事务类型:
1,手动事务:用开始和结束事务的显式指令(BEGIN TRANSACTION 和 END TRANSACTION )控制事务边界。从一个事务边界内可以开始第二个被称为嵌套事务的事务。直到所有从属事务提交,其父事务才提交。
2:自动事务:基于每个组件的声明特性集管理事务边界。事务自动流向被指示参与事务的对象,并跳过被指示在事务外部执行的对象。使用自动事务模型时无法嵌套事务。
分布式事务处理 (TP):分布式事务处理 (TP) 系统旨在协助在分布式环境中跨异类的事务识别资源的事务。
手动事务和 ADO.NET
SQL 客户端和 OLE DB .NET 提供程序在公共语言运行库中支持手动事务。在 ADO.NET 中,这两个 .NET 提供程序都可以用来控制事务。
应使用 ADO.NET 连接对象 Connection.BeginTransaction 开始本地事务。用 Command 对象的 Transaction 属性登记该事务中的命令。使用 Transaction 对象根据事务组件的成功或失败而提交或回滚在数据源做的修改。
登记在默认情况下是自动的,而且可以禁用。如果禁用了自动登记,您可以手动登记。在一个现有分布式事务中使用 Connection.EnlistDistributedTransaction 进行登记。
若要执行事务,请执行下列操作:
调用 Connection 对象的 BeginTransaction 方法来标记事务的开始。BeginTransaction 方法返回对 Transaction 的引用。该引用将分配给登记在事务中的 Command 对象。
将 Transaction 对象分配给要执行的 Command 的 Transaction 属性。如果通过活动的 Transaction 对象对 Connection 执行 Command,但该 Transaction 对象尚未分配给 Command 的 Transaction 属性,则将引发异常。
执行所需的命令。
调用 Transaction 对象的 Commit 方法来完成事务,或调用 Rollback 方法来取消事务。
myConnection.Open();
SqlTransaction myTrans = myConnection.BeginTransaction();
SqlCommand myCommand = myConnection.CreateCommand();
myCommand.Transaction = myTrans;
try
{
myCommand.CommandText = "Insert into Region (RegionID, RegionDescription) VALUES (100, 'Description')";
myCommand.ExecuteNonQuery();
myCommand.CommandText = "Insert into Region (RegionID, RegionDescription) VALUES (101, 'Description')";
myCommand.ExecuteNonQuery();
myTrans.Commit();
Console.WriteLine("Both records are written to database.");
}
catch(Exception e)
{
try
{
myTrans.Rollback();
}
catch (SqlException ex)
{
if (myTrans.Connection != null)
{
Console.WriteLine("An exception of type " + ex.GetType() +
" was encountered while attempting to roll back the transaction.");
}
}
分布事务:
如果 Connection 对象确定事务是活动的,它将自动登记在现有的分布式事务中。当打开连接或从连接池中检索连接时,将发生自动事务登记。这种情况,如果在Connection打开后,如果想再将新的的操作(command)登记入事务使不可能的。此时,应禁用自动登记功能:
sqlserver为在连接字符串中设置Enlist字段为false:Enlist=false
oledb中为OLE DB Services=-7
此时可以使用 EnlistDistributedTransaction 在事务中登记 Connection
SqlConnection nwindConn = new SqlConnection(".......;Enlist=false;");
SqlCommand cmd = new SqlCommand("......", nwindConn);
...
nwindConn.Open();
ITransaction trans =(ITransaction)ContextUtil.Transaction;//获取当前分布事务
nwindConn.EnlistDistributedTransaction(trans);//之前必须nwindConn.Open();
try
{
cmd.ExecuteNonQuery();//执行事务
ContextUtil.SetComplete();//提交事务
}
catch (SqlException e)
{
ContextUtil.SetAbort();
}
finally
{
nwindConn.Close();
}
例子:
/// <summary>
/// SQL Server事务样本类,演示Sql的事务操作
/// 作者:李斌(Camus)
/// </summary>
public class SQLServerTransactionDemo
{
private SQLServerTransactionDemo(){}
/// <summary>
/// 获取SQL Server事务样本类的实例方法
/// </summary>
/// <returns>SQL Server事务样本类的实例</returns>
public static SQLServerTransactionDemo GetHandle()
{
return new SQLServerTransactionDemo();
}
#region 运行SQL Server事务Run方法
/// <summary>
/// 运行SQL Server事务
/// </summary>
public void Run()
{
// 访问Microsoft SQL Server样本数据库Northwind,假设Microsoft SQL Server的sa密码为空
string connectionString=@"Server=(Local);Database=Northwind;UID=sa;PWD=;Persist Security Info=false;";
//创建Connection对象
System.Data.SqlClient.SqlConnection sqlConnection = null;
System.Data.SqlClient.SqlTransaction sqlTransaction = null;
try
{
sqlConnection = new System.Data.SqlClient.SqlConnection(connectionString);
sqlConnection.Open();//打开Connection
// 开始本地事务,Connection.BeginTransaction()
// IsolationLevel.ReadCommitted:
// 在正在读取数据时保持共享锁,以避免脏读,但是在事务结束之前可以更改数据,从而导致不可重复的读取或幻像数据。
sqlTransaction = sqlConnection.BeginTransaction(System.Data.IsolationLevel.ReadCommitted,"SQLTransaction");
//创建Command对象
System.Data.SqlClient.SqlCommand sqlCommand = sqlConnection.CreateCommand();
// 指派Connection和Transaction对象给Command对象
sqlCommand.Connection = sqlConnection;
sqlCommand.Transaction = sqlTransaction;
//开始执行事务,该事务由命令1 2 3组成.
// 执行数据库命令1
sqlCommand.CommandText = "Insert into Region (RegionID, RegionDescription) VALUES (200, \'Description\')";
sqlCommand.ExecuteNonQuery();
// 执行数据库命令2
sqlCommand.CommandText = "Insert into Region (RegionID, RegionDescription) VALUES (201, \'Description\')";
sqlCommand.ExecuteNonQuery();
// 执行数据库命令3!!!与命令1相同,会出错
sqlCommand.CommandText = "Insert into Region (RegionID, RegionDescription) VALUES (200, \'Description\')";
sqlCommand.ExecuteNonQuery();
// 提交事务
sqlTransaction.Commit();
Console.WriteLine("两条数据库命令已经执行完成.");
}
catch(Exception e)
{
try
{
if(sqlTransaction != null)
{
// 回滚事务
sqlTransaction.Rollback("SQLTransaction");
}
}
catch (System.Data.SqlClient.SqlException ex)
{
// 回滚事务失败
if (sqlTransaction.Connection != null)
{
Console.WriteLine("执行回滚事务时出现 " + ex.GetType() + " 违例!" + ex.Message);
}
}
Console.WriteLine("在执行数据库命令时出现 " + e.GetType() + " 违例!" + e.Message);
Console.WriteLine("两条数据库命令均未完成.");
}
finally
{
//关闭Connection
if(sqlConnection != null)
{
sqlConnection.Close();
}
}
}
#endregion
public static void Main(string[] args)
{
SQLServerTransactionDemo.GetHandle().Run();
}
}
分享到:
相关推荐
3. **using语句**:这是处理实现了IDisposable接口的对象的推荐方式,它会在完成工作后自动调用Dispose方法释放资源。 4. **多个catch块**:可以使用多个catch块来捕获不同类型的异常,分别处理。 5. **throw语句**...
下面将详细探讨ASP.NET事务处理的相关知识点。 1. **事务的基本概念**:事务是一组逻辑操作,这些操作被视为一个单一的工作单元,只有当所有操作都成功时,事务才会提交;如果有任何操作失败,整个事务都将回滚,...
2. **ADO.NET事务管理**:在ADO.NET中,我们通常使用`System.Data.SqlClient.SqlTransaction`类来处理SQL Server的事务。首先,我们需要打开一个连接,然后创建一个事务对象,并在连接上开始事务。 3. **多适配器...
在.NET中,我们可以通过Attribute来实现AOP的功能,这就是标题中提到的"attribute实现方法调用拦截"。 Attribute的使用通常是通过定义自定义Attribute类,然后在需要的地方应用这些特性。例如,我们可以创建一个`...
##### 2.1 ADO.NET事务处理 ADO.NET是.NET框架中的一个重要组成部分,它提供了一组用于访问关系型数据库的服务。在ADO.NET中,可以使用`SqlConnection`类的方法`BeginTransaction()`来启动一个事务。事务可以通过...
在本课程"ADO.NET事务处理"中,我们将深入学习如何在.NET环境中有效地管理数据库事务,确保数据的一致性和完整性。 事务处理在数据库系统中扮演着至关重要的角色,它保证了多步骤操作的原子性、一致性、隔离性和...
Ado.Net事务处理通过使用`Connection`对象和`Transaction`对象来实现。首先,通过调用`Connection`对象的`BeginTransaction`方法来开启一个新的事务。这标志着事务的开始。接着,将创建的`Transaction`对象分配给要...
在ASP.NET中,事务处理是一项关键的技术,用于确保数据的一致性和完整性,尤其是在涉及多条数据库操作时。本案例将探讨如何利用Session和SqlTransaction对象来实现简单的事务管理,以及如何实现批量数据的整体上传。...
最近想给我的框架加一种功能,就是比如给一个方法加一个事务的特性Attribute,那这个方法就会启用事务处理。给一个方法加一个缓存特性,那这个方法就会进行缓存。 这个也是网上说的面向切面编程AOP。 AOP的概念也很...
在.NET中实施事务处理时,可以根据具体的应用场景选择合适的方法: - **手动事务**:适合于需要精细控制事务流程的场景,比如复杂的业务逻辑或跨多个数据源的事务处理。 - **自动事务**:适合于简单场景或希望简化...
在这个“.NET 一般处理程序的增删改示例程序”中,我们将深入探讨如何使用HTTP Handlers实现数据库操作,包括添加、删除和修改数据。 首先,一个HTTP Handler通常是一个实现了`IHttpHandler`接口的类。这个接口有两...
在示例代码中,按钮点击事件触发一个数据库操作,通过`SqlConnection`和`SqlCommand`对象在存储过程中实现事务处理。 总的来说,Asp.Net中的事务和异常处理是确保Web应用程序在处理敏感数据时,能够在异常情况下...
本示例"asp.net 增删改查+事务处理示例"将深入讲解如何在ASP.NET环境中实现这些核心功能,并结合事务处理以确保数据的一致性。 首先,创建(Create)数据通常涉及使用ASP.NET的表单提交或AJAX技术来接收用户输入,...
【Asp.Net事务和异常处理】是开发过程中确保数据完整性和一致性的重要机制。在Asp.Net中,事务处理主要用于管理数据库操作,确保一组操作要么全部成功,要么全部回滚,防止部分完成导致的数据不一致。这主要涉及到...
在.NET框架中,事务是确保一组数据库操作要么...无论是自动化的 `TransactionScope`,还是手动的 ADO.NET 事务,或者是更高级别的事务管理工具,都需要深入理解和实践,以确保在复杂的系统环境中实现可靠的数据一致性。
当用户触发该操作时,`Form1`会调用`DbHelperSQL`中的事务处理方法,执行一系列SQL命令。 `AssemblyInfo.cs`文件包含了关于程序集的信息,如版本号、版权信息等,与事务处理的具体逻辑关系不大,但在构建和部署项目...
在ASP.NET中,事务处理主要通过`SQL-Transaction`类来实现。 ##### 1.1 事务处理的基本原理 事务处理通常包括以下几个关键步骤: - **开始事务**:使用`BeginTransaction()`方法开启一个事务。 - **执行操作**:...
**ASP.NET事务处理** 事务处理是数据库操作中的核心概念,它确保一组数据库操作要么全部成功,要么全部失败,以维护数据的一致性。在ASP.NET中,你可以使用System.Transactions命名空间中的类来管理和控制事务。例如...
2. **异常处理**:在事务处理过程中,需要妥善处理可能出现的各种异常情况,避免因为异常而导致的数据不一致问题。 3. **性能考虑**:虽然事务可以确保数据一致性,但频繁地使用事务也可能会对系统性能产生影响。...
总结来说,这个"ADO.NET通用类库实现与实例"提供了全面的数据库操作功能,包括基本的数据操作、事务处理策略以及数据库管理,是C#开发者进行数据库编程的有力工具。通过学习和使用这个类库,可以更好地理解和掌握ADO...