百度首页 | 百度空间
 
查看文章
 
.NET事务处理学习一System.Transaction类(一)
2008年06月14日 星期六 18:08

事务:实现ACID特性的操作集合。如果没有系统级的帮助,我们自己想实现是很难的事情。.NET2.0中内置了System.Transaction类,来帮助我们实现事务。

创建测试数据库:

USE [TestDB]

GO

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

CREATE TABLE [dbo].[TransactionTest](

[ID] [int] NOT NULL,

[TransactionTestNull] [int] NULL,

[TransactionTestNotNull] [int] NOT NULL,

CONSTRAINT [PK_TransactionTest] PRIMARY KEY CLUSTERED

(

[ID] ASC

)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]

) ON [PRIMARY]

创建此数据库的目的是产生无法Insert的错误,检测事务能否回滚。

关键C#代码片段:

        using (TransactionScope ts = new TransactionScope(TransactionScopeOption.Required))

         {

            SqlConnection conn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["TransactionConnectionString"].ConnectionString);

            //插入成功的记录

            SqlCommand sc = new SqlCommand();

             sc.Connection = conn;

             sc.CommandText = "INSERT INTO TransactionTest (TransactionTestNull, TransactionTestNotNull, ID) VALUES      ('3','3','3')";

             sc.CommandType = CommandType.Text;

             conn.Open();

             sc.ExecuteNonQuery();

            conn.Close();

            //插入无法插入的记录,产生错误

             sc.CommandText = "INSERT INTO TransactionTest (TransactionTestNull,ID) VALUES      ('4','4')";

             conn.Open();

             sc.ExecuteNonQuery();

             conn.Close();

             ts.Complete();

         }

conn.Close();添加断点,按F5编译运行,在执行到断点时,我们可以切换到SMSS的窗口,可以运行SELECT语句,可以看到如下截图,注意:如果程序不继续运行,下面的查询时始终无法执行完成。

可以猜想到SQL 为了避免脏读而加上了排他锁。

按F5继续运行,会出现下面错误:

我们再切换到SMSS,运行Select查询,会发现数据表没有什么变化,表明事务因为错误已经被回滚。事务处理试验成功。


类别:编程开发 | 添加到搜藏 | 浏览() | 评论 (0)
 
最近读者:
 
网友评论:
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
验证码:
 

     

©2008 Baidu