C#事务处理
2009-11-05 17:40
239 查看
一:事物的特点(ACID)
1:原子性,要么全部执行,要么全部不执行
2:一致性
3:隔离性
4:持久性
二:操作事务的典型步骤
1:创建一个Connection对象,建立与数据库的连接
SqlConnection myConnection = new SqlConnection(connectString);
myConnection.Open();
2:使用Connection.BeginTransaction方法创建一个Transaction对象,启动本地事务。
SqlTransaction myTrans = myConnection.BeginTransaction();
3:创建一个Command对象
SqlCommand myCommand = myConnection.CreateCommand();
4:将Transaction对象分配给Command对象的Transaction属性
myCommand.Transaction = myTrans;
5:执行数据库命令
cmd.CommandText = "Insert into...."
cmd.ExecuteNonQuery();
6:根据命令的执行结果调Commit提交事务或Rollback方法取消事务。
myTrans.Commit();
myTrans.Rollback();
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[InsertOrder]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[InsertOrder]
--从当前数据库中删除一个或多个存储过程或过程组。
GO
SET QUOTED_IDENTIFIER OFF
--当 SET QUOTED_IDENTIFIER 为 ON 时,标识符可以由双引号分隔,而文字必须由单引号分隔。
--当 SET QUOTED_IDENTIFIER 为 OFF 时,标识符不可加引号,且必须符合所有 Transact-SQL 标识符规则。
GO
SET ANSI_NULLS OFF
--当设置为 ON 时,所有与空值比较的值都取值为 NULL(未知)。
--当设置为 OFF 时,如果两个值都为 NULL,则非 Unicode 值与空值比较的值都取值为 TRUE。
GO
use northwind
GO
--------------------------------------------------
-- InsertOrder
--------------------------------------------------
CREATE PROCEDURE InsertOrder
@CustomerID nchar(5),
@EmployeeID int,
@OrderDate datetime,
@RequiredDate datetime,
@ShippedDate datetime,
@ShipAddress nvarchar(60),
@Id int OUTPUT
AS
BEGIN TRANSACTION
-- Insert Values into the Orders table
INSERT Into Orders(
CustomerID,
EmployeeID,
OrderDate,
RequiredDate,
ShippedDate,
ShipAddress
)Values(
@CustomerID,
@EmployeeID,
@OrderDate,
@RequiredDate,
@ShippedDate,
@ShipAddress
)
-- Get the new Order Identifier, return as OUTPUT param
SELECT @Id = @@IDENTITY
COMMIT TRANSACTION
RETURN 0
--------------------------------------------------
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
三:示例
public void RunSqlTransaction(string myConnString)
{
SqlConnection myConnection = new SqlConnection(myConnString);
SqlCommand myCommand = myConnection.CreateCommand();
SqlTransaction myTrans;
myTrans = myConnection.BeginTransaction();
myCommand.Connection = myConnection;
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.");
}
}
Console.WriteLine("An exception of type " + e.GetType() +
" was encountered while inserting the data.");
Console.WriteLine("Neither record was written to database.");
}
finally
{
myConnection.Close();
}
}
1:原子性,要么全部执行,要么全部不执行
2:一致性
3:隔离性
4:持久性
二:操作事务的典型步骤
1:创建一个Connection对象,建立与数据库的连接
SqlConnection myConnection = new SqlConnection(connectString);
myConnection.Open();
2:使用Connection.BeginTransaction方法创建一个Transaction对象,启动本地事务。
SqlTransaction myTrans = myConnection.BeginTransaction();
3:创建一个Command对象
SqlCommand myCommand = myConnection.CreateCommand();
4:将Transaction对象分配给Command对象的Transaction属性
myCommand.Transaction = myTrans;
5:执行数据库命令
cmd.CommandText = "Insert into...."
cmd.ExecuteNonQuery();
6:根据命令的执行结果调Commit提交事务或Rollback方法取消事务。
myTrans.Commit();
myTrans.Rollback();
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[InsertOrder]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[InsertOrder]
--从当前数据库中删除一个或多个存储过程或过程组。
GO
SET QUOTED_IDENTIFIER OFF
--当 SET QUOTED_IDENTIFIER 为 ON 时,标识符可以由双引号分隔,而文字必须由单引号分隔。
--当 SET QUOTED_IDENTIFIER 为 OFF 时,标识符不可加引号,且必须符合所有 Transact-SQL 标识符规则。
GO
SET ANSI_NULLS OFF
--当设置为 ON 时,所有与空值比较的值都取值为 NULL(未知)。
--当设置为 OFF 时,如果两个值都为 NULL,则非 Unicode 值与空值比较的值都取值为 TRUE。
GO
use northwind
GO
--------------------------------------------------
-- InsertOrder
--------------------------------------------------
CREATE PROCEDURE InsertOrder
@CustomerID nchar(5),
@EmployeeID int,
@OrderDate datetime,
@RequiredDate datetime,
@ShippedDate datetime,
@ShipAddress nvarchar(60),
@Id int OUTPUT
AS
BEGIN TRANSACTION
-- Insert Values into the Orders table
INSERT Into Orders(
CustomerID,
EmployeeID,
OrderDate,
RequiredDate,
ShippedDate,
ShipAddress
)Values(
@CustomerID,
@EmployeeID,
@OrderDate,
@RequiredDate,
@ShippedDate,
@ShipAddress
)
-- Get the new Order Identifier, return as OUTPUT param
SELECT @Id = @@IDENTITY
COMMIT TRANSACTION
RETURN 0
--------------------------------------------------
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
三:示例
public void RunSqlTransaction(string myConnString)
{
SqlConnection myConnection = new SqlConnection(myConnString);
SqlCommand myCommand = myConnection.CreateCommand();
SqlTransaction myTrans;
myTrans = myConnection.BeginTransaction();
myCommand.Connection = myConnection;
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.");
}
}
Console.WriteLine("An exception of type " + e.GetType() +
" was encountered while inserting the data.");
Console.WriteLine("Neither record was written to database.");
}
finally
{
myConnection.Close();
}
}
相关文章推荐
- 领域模型中分散的事务如何集中统一处理(C#解决方案)
- C# 事务处理
- .net企业应用高级编程 第五章 自动化处理和事务处理(基于C# XML)案例
- [转载]C#中使用ADO.NET连接SQL Server数据库,自动增长字段用作主键,处理事务时的基本方法
- c# + mysql + 事务处理(转载于 《C#数据库事务原理及实践》)
- 原创 C#事务处理简明示例 收藏
- C#中的事务处理(TransactionTest)
- C#中的事务处理
- C#处理Access中的事务
- C#实现数据库事务处理示例代码
- C#处理Access中事务的方法
- C#处理Access中的事务
- c# 事务处理
- C#中分布式事务的超时处理问题
- C#中的事务处理
- c#中的事务处理
- .NET中的处理 Transact-SQL 事务(C#)SqlTransaction 类
- C# 操作数据库分布式事务处理
- C#学习笔记18——.NET 事务处理
- 利用C#事务处理对数据库进行多重操作