Chinaunix首页 | 论坛 | 博客
  • 博客访问: 387930
  • 博文数量: 95
  • 博客积分: 3020
  • 博客等级: 中校
  • 技术积分: 865
  • 用 户 组: 普通用户
  • 注册时间: 2008-05-20 10:40
文章分类

全部博文(95)

文章存档

2011年(3)

2010年(8)

2009年(24)

2008年(60)

我的朋友

分类: 数据库开发技术

2008-09-18 12:06:27

一、事务:是一种机制,是一个操作序列,它包含一组数据库操作命令,并且所有的命令作为一个整体一起向系统提交或撤消操作请求,即这一组数据命令要么都执行,要么都不执行,因此事务是一个不可分割的工作逻辑单元.在数据库系统中执行并发操作时事务是作为最小的控制单元来使用的.
 
事务的特性:
1、原子性:一个事务中的所有语句被作为单个执行单元来对待。整个单元必须完整地结束,或者该事务被认为已经失败且必须被退回。
2、一致性:一致性意味着数据库的状态在一个事务之前和之后都是有效的。如客户购买一件商品,数据库应显示商店收到来自客户的付款,并且库存减少一件商品。
3、隔离性:即不同的事务之间不能相互干扰。这种要求有时也被称为事务的串行性。
4、持久性:一旦事务得到提交,对数据库的修改立即变成永久性的。即使在该提交后的那一时刻有一个彻底的系统故障,但在系统重新启动后,数据库仍显示该事务的执行结果。
 
事务的分类:
1、自动提交事务(SQL默认模式):每条单独的语句都是一个事务。
 
例:创建成一个t1表并在该表中插入三条记录:
create table t2(
id int primary key,
col1 varchar(10) not null,
col2 varchar(10) null,
)
go
insert into t2 values(1,'AA','AA')
insert into t2 values(2, null,'BB')    ------第二个字段为null
insert into t2 values(3,'CC','CC')
go
select * from t2    ------得到结果是显示了第1条和第3条记录,而第二条记录因为为null,所以出错没有插入成功.
*为SQL使用自动提交事务时,每一个语句本身是一个事务.如果这个语句产生了错误,它的事务会自动回退.如果这个语句成功执行而没有产生错误,它的事务会自动提交.因此,第一个和第三个语句将被提交,而第二个有错误的语句会回退.
 
2、显式事务:开发者要定义一个事务在何处开始,并定义这个事务在何时需要提交或回退。事务均以 begin transaction语句显式开始,以 commit transactionrollback transaction语句显式结束(transaction可使用它的缩写tran)。回滚:rollback,错误处理:try...catch
 
例:以刚才那个t2表为例,删除所有数据。t2表中插入与上例相同的三行数据。这次希望将三条记录要么都插入到表中,要么一条也不插入。因此,需要将语句组织在一个显式事务中。
begin tran
insert into t2 values(1,'AA','AA')
insert into t2 values(2, null,'BB')    ------第二个字段为null
insert into t2 values(3,'CC','CC')
commit tran    得到结果显示与上面相同,为第1条与第3条记录插入成功,第二条记录出错没有被插入。
 
* 开发者的职者不仅包括定义事务的长度,还要决定是否要进行事务的回退rollback。所以需要在事务中加入一个错误处理程序。如果没有错误处理程序,SQL将简单地在错误之后处理下一个语句,因此,得到的结果与在自动提交模式时一样。
* SQL代码中的错误可使用try...catch语句处理,try...catch构造包括两部分:一个try块和一个catch块。如果在try块内的Transact-SQL 语句中检测到错误条件,则控制将被传递到catch块(可在此块中处理此错误)。
 
begin try
begin tran
insert into t2 values(1,'AA','AA')
insert into t2 values(2, null,'BB')    ------第二个字段为null
insert into t2 values(3,'CC','CC')
commit tran    得到结果显示与上面相同,
commit tran
end try
begin catch
rollback tran    ------回滚
end catch
select * from t2    ------显示结果没有任何记录

* 执行select语句,可以看到没有任何记录被插入到表中,整个事务都回退了。当insert语诡发生违规插入的时候,SQL跳到catch语句,并回退了该事务。
* 以上代码存在的唯一问题是不能获取任何错误消息。可以catch块中使用特定函数来获取错误并对错误进行管理。还可以用raiserror函数抛出一个自定义的错误。
ERROR_NUMBER() 返回错误号。
ERROR_MESSAGE() 返回错误消息的完整文本。此文本包括为任何可替换参数(如长度、对象名或时间)提供的值。
ERROR_SEVERITY() 返回错误严重性。
ERROR_STATE() 返回错误状态号。
ERROR_LINE() 返回导致错误的例程中的行号。
ERROR_PROCEDURE() 返回出现错误的存储过程或触发器的名称。

可把上个事务改写成:
begin try
begin tran
insert into t2 values(1,'AA','AA')
insert into t2 values(2, null,'BB')    ------第二个字段为null
insert into t2 values(3,'CC','CC')
commit tran   
commit tran
end try
begin catch
select ERROR_NUMBER() ,
ERROR_MESSAGE() ,
ERROR_SEVERITY(),
ERROR_STATE(),
ERROR_LINE() ,
ERROR_PROCEDURE()
raiserror('error in tran!',14,1)    ------自定义出错
rollback tran
end catch
     ------显示为(1 row(s) affected)Msg 50000, Level 14, State 1, Line 15 error in tran!(1行受影响 消息50000,级别14,状态1,第15行error in tran!)

3、隐式事务:每次执行SQL Server 的任何数据修改语句时,它都是一个隐式事务。我们没有规定什么时候是事务的开始,什么时候是事务的结束。通过set implicit_transactions on 语句,将隐式事务模式设置为打开。如何判断一个事务是隐式事务还是显式事务。也就是看一下有没有begin transaction语句。在将事务模式设置为打开之后,SQL首次执行下列中列出的任何语句时,都会自动启动一个事务。
alter table     crant     fetch     delete     create     revoke     insert
select     drop     open     update     truncate table

例:

set implicit_transaction on            ------打开隐式事务
create table t2(id int primary key)    ------隐式事务启动
insert into t2 values(3)               ------在隐式事务中
rollback tran                          ------回退事务
set implicit_transactions off          ------关闭隐式事务

阅读(1003) | 评论(0) | 转发(0) |
0

上一篇: 9.10(SQL基础学习七)

下一篇:人生哲理

给主人留下些什么吧!~~