事务类似于JAVA的线程的同步,作为一个单元执行。它有四大特性:原子性,隔离性,一致性,持久性。在SQL SERVER 2000里面还支持存储点的用法。大家都知道,事务是做为一个单元运行,要么全部执行,要么全部不执行。但是有时候我们可以保证事务的一部分可能正确执行,并且这些执行可以直接刷新到数据库里面。那么我们就可以在这个事务的中间部分设置一个或者多个存储点。这样在这个事务大单元里就分成了几个小部分。
如果上面的部分执行正确,下面的部分执行错误,那么就没必要回滚整个事务,只需要回滚到存储点的地方就可以了。下面请看一个带有存储点的事务执行过程。
--创建数据库
if exists(select name from master..sysdatabases
where name='student')
drop database student
go
create database student
go
use student
go
--创建表
if exists(select name from sysobjects
where name='stu'and type='u')
drop table stu
go
create table stu
(
s_id int primary key,
s_name char(20),
age int not null default 25 ,
b_id int
)
go
insert into stu values(1001,'andy',39,101)
insert into stu values(1002,'jacky',33,101)
insert into stu values(1003,'sandy',29,102)
insert into stu values(1004,'lray',19,102)
insert into stu values(1005,'jay',26,102)
insert into stu values(1006,'lucy',22,103)
select * from stu
--事务的操作
declare @status1 int
declare @status2 int
begin tran trstu
insert into stu values(6467,'hhh',28,101)
select @status1=@@error
save tran point
update stu
set s_name = '***ddddd'
--插入重复的主键值的话就会出错
insert into stu values(5167,'aa',21,102)
select @status2=@@error
if @status1<>0
rollback tran trstu
if @status2<>0
begin
print @status2
rollback tran point
end
commit tran trstu