您的位置:首页 > 编程语言 > C#

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();

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: