SQL Transcation的一些总结分享

来源:asp之家 时间:2012-08-21 10:21:28 

1.1.1 摘要
相信大家对于SQL Transcation再熟悉不过,它确保了数据库的数据一致性和安全性,尤其在对数据执行增删时,如果发生异常和错误它就会触发事务回滚,从而确保了我们数据的一致性和安全性,下面我们将通过分四部分介绍事件(Transcation)。

1.1.2 正文
首先让我们通过一个具体的例子介绍Transcation的使用,假如我们的数据库中有一个表UserInfo,它包含三个字段分别为:UserID(自增)、UserName (nvarchar)和LuckyNumber (tinyint),如下图所示:


图1 UserInfo表


UserInfo表的sql代码如下: 

代码如下:


-- The definition of UserInfo.
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[UserInfo](
[UserID] [int] IDENTITY(1,1) NOT NULL,
[UserName] [nvarchar](50) NOT NULL,
[LuckyNumber] [tinyint] NOT NULL
) ON [PRIMARY]


接着我们要把数据插入到表UserInfo中,这里使用一个存储过程把数据插入到该表中,存储过程SPAddDataToUserInfo的定义如下: 

代码如下:


-- =============================================
-- Author: JKhuang
-- Create date: 12/8/2011
-- Description: Inserts data
-- =============================================
CREATE PROCEDURE SPAddDataToUserInfo

AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;

-- Hard code inserted data.
INSERT INTO UserInfo VALUES('JKhuang', 8);
INSERT INTO UserInfo VALUES('JKRush', 23);
INSERT INTO UserInfo VALUES('Jackson', 20111111);
END
GO


现在我们已经定义了一个存储过程,接着让我们执行该存储过程。

图2执行存储过程的消息


通过上图我们知道在执行存储过程中发生了异常,而且是由于值“20111111”数据超出了tinyint的范围产生的,现在让我们看一下数据插入的情况。

图3 UserInfo表中数据

我们发现只插入了两行数据,而第三行数据没有成功插入,但为了确保数据完整性,我们要把数据全部插入或全部不插入,这时我们可以考虑使用Transcation来确保数据完整性和安全性。
接着让我们修改一下存储过程SPAddDataToUserInfo,在存储过程中添加Transcation。

代码如下:


-- =============================================
-- Author: JKhuang
-- Create date: 12/8/2011
-- Description: Inserts data
-- =============================================
Alter PROCEDURE SPAddDataToUserInfo
AS
BEGIN
BEGIN TRANSACTION
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Hard code inserted data.
INSERT INTO UserInfo VALUES('JKhuang', 8);
INSERT INTO UserInfo VALUES('Jackson', 20111111);
INSERT INTO UserInfo VALUES('JKRush', 23);
COMMIT TRANSACTION
END
GO


现在我们再执行一次存储过程看一下是否全部不插入到表中。

图4 UserInfo表中数据

我们发现结果和没有添加Transcation处理一样,数据依然插入到表中。这究竟是什么原因呢?也许细心的你已经发现了,我们没有添加事务回滚——ROLLBACK。
但我们究竟要在哪里添加事务回滚(ROLLBACK)呢?或更具体地说:“究竟什么时候我们要触发事务回滚(ROLLBACK)呢”?
由于我们数据插入失败是因为插入过程发生了异常情况,那么我们就要捕获异常和处理异常,那就是TRY/CATCH的设计了,好让我们继续完善我们的存储过程吧。

代码如下:


-- =============================================
-- Author: JKhuang
-- Create date: 12/8/2011
-- Description: Inserts data
-- =============================================
Alter PROCEDURE SPAddDataToUserInfo
AS
BEGIN
BEGIN TRY
BEGIN TRANSACTION
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Hard code inserted data.
INSERT INTO UserInfo VALUES('JKhuang', 8);
INSERT INTO UserInfo VALUES('Jackson', 20111111);
INSERT INTO UserInfo VALUES('JKRush', 23);
COMMIT TRANSACTION
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION
END CATCH
END
GO

现在我们给存储过程添加了异常处理机制TRY/CATCH(注意:SQLSERVER 2005或之后的版本才支持TRY/CATCH),接下来让我们再执行一次存储过程。
图5 UserInfo表中数据

看上去我们已经把问题的解决了,我们知道存储过程可以内嵌存储过程或函数,所以我们把上面的存储过程SPAddDataToUserInfo内嵌到存储过程SPMultiDataToUserInfo中,SPMultiDataToUserInfo的定义如下:

代码如下:


-- =============================================
-- Author: JKhuang
-- Create date: 12/8/2011
-- Description: Invokes store procedure to insert data.
-- =============================================
CREATE PROCEDURE SPMultiDataToUserInfo

AS
BEGIN
BEGIN TRY
BEGIN TRANSACTION

-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
--SET NOCOUNT ON;

-- Hard code inserted data.
INSERT INTO UserInfo VALUES('Cris', 1);
EXEC SPAddDataToUserInfo
INSERT INTO UserInfo VALUES('Ada', 32);

COMMIT TRANSACTION

END TRY
BEGIN CATCH

ROLLBACK TRANSACTION

END CATCH

END
GO

标签:SQL,Transcation
0
投稿

猜你喜欢

  • js中鼠标滚轮事件详解

    2010-02-05 12:20:00
  • 关于Dreamweaver乱码问题的解决方案

    2010-09-02 12:36:00
  • DreamWeaver操作超级技巧大全

    2008-10-03 20:50:00
  • 用ASP建立一个简单的聊天室

    2007-09-21 12:43:00
  • Oracle PL/SQL语言入门基础

    2010-07-20 13:28:00
  • 泛域名设置问题

    2008-03-25 10:03:00
  • 九宫格基本布局

    2009-06-18 18:36:00
  • 网页编辑常用表现的实现方法

    2010-07-02 16:24:00
  • 关注前端开发流程

    2009-12-31 17:38:00
  • SQL Server 2000 SP4补丁打不上的解决办法

    2010-03-08 13:13:00
  • MySQL数据库的授权原则

    2008-12-29 13:39:00
  • 使用:after清除浮动

    2008-10-30 12:10:00
  • 轻松解决:mysql数据库连接过多的错误

    2010-09-30 14:28:00
  • 国外404错误页面的创意设计欣赏

    2007-08-19 15:44:00
  • 复制链接到剪贴板,兼容Firefox Chrome IE

    2008-12-16 13:23:00
  • 女装类视觉设计分享

    2009-10-30 18:36:00
  • 编写一个asp代码执行器

    2007-09-24 16:05:00
  • Ext2.0.2经典的一个JS组件(带EXT中文手册)

    2009-04-13 12:24:00
  • 100%点击区的滑动门

    2007-06-14 22:00:00
  • asp如何对数组显示和排序?

    2009-11-20 18:30:00
  • asp之家 网络编程 m.aspxhome.com