查看文章 |
事务:实现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查询,会发现数据表没有什么变化,表明事务因为错误已经被回滚。事务处理试验成功。 |