SQL事务处理

所谓事务是指一组逻辑操作单元,它使数据从一种状态变换到另一种状态。
包括四个特性:
1、原子性       

就是事务应作为一个工作单元,事务处理完成,所有的工作要么都在数据库中保存下来,要么完全回滚,全部不保留
2、一致性            

事务完成或者撤销后,都应该处于一致的状态
3、隔离性            

多个事务同时进行,它们之间应该互不干扰.应该防止一个事务处理其他事务也要修改的数据时,
不合理的存取和不完整的读取数据  
4、持久性            

事务提交以后,所做的工作就被永久的保存下来

示例:创建一个存储过程,向两个表中同时插入数据
Create proc RegisterUser
(@usrName varchar(30), @usrPasswd varchar(30),@age int,@sex varchar(10), @PhoneNum varchar(20), @Address varchar(50) )
as begin
begin tran
insert into userinfo(userName,userPasswd) values(@usrName,@usrPasswd)
if @@error<>0
begin

rollback tran

return -1
end
insert into userdoc(userName,age,sex,PhoneNumber,Address)values(@Usrname,@age,@sex,@PhoneNum,@Address)
if @@error<>0
begin

rollback tran
return -1  
end

commit tran
return 0
end

事务的分类
按事务的启动与执行方式,可以将事务分为3类:
显示事务  
也称之为用户定义或用户指定的事务,即可以显式地定义启动和结束的事务。分布式事务属于显示事务
自动提交事务
默认事务管理模式。如果一个语句成功地完成,则提交该语句;如果遇到错误,则回滚该语句。
隐性事务
当连接以此模式进行操作时,sql将在提交或回滚当前事务后自动启动新事务。无须描述事务的开始,只需提交或回滚每个事务。它生成连续的事务链。

一、显示事务
通过begin transacton、commit transaction、commit work、rollback transaction或rollback work等语句完成。
1、启动事务
格式:begin tran 事务名或变量 with mark 描述
2、结束事务
格式:commit tran 事务名或变量 (事务名与begin tran中的事务名一致
或commit work 但此没有参数
3、回滚事务
rollback tran 事务名或变量 | savepoint_name | savepoint_variable  
或rollback work
说明:清除自事务的起点或到某个保存点所做的所有数据修改
4、在事务内设置保存点
格式:save tran savepoint_name | savepoint_variable  
示例:
use bookdb
go
begin tran mytran
insert into book
values(9,"windows2000',1,22,'出版社')
save tran mysave
delete book where book_id=9
rollback tran mysave
commit tran
go
select * from book
go
可以知道,上面的语句执行后,在book中插入了一笔记录,而并没有删除。因为使用rollback tran mysave 语句将操作回滚到了删除前的保存点处。
5、标记事务
格式:with mark
例:使用数据库标记将日志恢复到预定义时间点的语句
在事务日志中置入一个标记。请注意,被标记的事务至少须提交一个更新,以标记该日志。

BEGIN TRAN MyMark WITH MARK
UPDATE pubs.dbo.LastLogMark SET MarkTime = GETDATE()
COMMIT TRAN MyMark

按照您常用的方法备份事务日志。

BACKUP LOG pubs TO DISK='C:\Backups\Fullbackup.bak' WITH INIT

现在您可以将数据库恢复至日志标记点。首先恢复数据库,并使其为接受日志恢复做好准备。

RESTORE DATABASE pubs FROM DISK=N'C:\Backups\Fullbackup.bak' WITH NORECOVERY

现在将日志恢复至包含该标记的时间点,并使其可供使用。请注意,STOPAT在数据库正在执行大容量日志时禁止执行。

RESTORE LOG pubs FROM DISK=N'C:\Backups\Logbackup.bak' WITH RECOVERY,
STOPAT='02/11/2002 17:35:00'

5、不能用于事务的操作
创建数据库 create database
修改数据库 alter database
删除数据库 drop database
恢复数据库 restore database
加载数据库 load database
备份日志文件 backup log
恢复日志文件 restore log
更新统计数据 update statitics
授权操作              grant
复制事务日志 dump tran
磁盘初始化           disk init
更新使用sp_configure后的系统配置           reconfigure

二、自动提交事务
sql连接在begin tran 语句启动显式事务,或隐性事务模式设置为打开之前,将以自动提交模式进行操作。当提交或回滚显式事务,或者关闭隐性事务模式时,将返回到自动提交模式。
示例:
由于编译错误,使得三个insert都没执行
use test
go
create table testback(cola int primary key ,colb char(3))
go
insert into testback values(1,'aaa')
insert into testback values(2,'bbb')
insert into testback value(3,'ccc') /*符号错误*/
go
select * from testback
go
没有任何结果返回

三、隐式事务
通过 API 函数或 Transact-SQL SET IMPLICIT_TRANSACTIONS ON 语句,将隐性事务模式设置为打开。下一个语句自动启动一个新事务。当该事务完成时,再下一个 Transact-SQL 语句又将启动一个新事务。
当有大量的DDL 和DML命令执行时会自动开始,并一直保持到用户明确提交为止,切换隐式事务可以用SET IMPLICIT_TRANSACTIONS
为连接设置隐性事务模式.当设置为 ON 时,SET IMPLICIT_TRANSACTIONS 将连接设置为隐性事务模式。当设置为 OFF 时,则使连接返回到自动提交事务模式
语句包括:
alter table          insert           open          create             delete            revoke          drop
select                fetch            truncate table                grant             update
示例:
下面使用显式与隐式事务。它使用@@tracount函数演示打开的事务与关闭的事务:
use test
go
set nocount on
create table t1(a int)
go
insert into t1 values(1)
go

print '使用显式事务'
begin tran
insert into t1 values(2)
print '事务外的事务数目:'+cast(@@trancount as char(5))
commint tran
print '事务外的事务数目:'+cast(@@trancount as char(5))
go

print
go
set implicit_transactions on
go

print '使用隐式事务'
go
insert into t1 values*4)
print'事务内的事务数目:'+cast(@@trancount as char(5))
commint tran
print'事务外的事务数目:'+cast(@@trancount as char(5))
go
执行结果:
使用显示事务
事务内的事务数目:2
事务外的事务数目:1
使用隐式事务
事务内的事务数目:1
事务外的事务数目:0

四、分布式事务
跨越两个或多个数据库的单个sql server中的事务就是分布式事务。
与本地事务区别:必须由事务管理器管理,以尽量避免出现因网络故障而导致一个事务由某些资源管理器成功提交,但由另一些资源管理器回滚的情况。

sql server 可以由DTc microsoft distributed transaction coordinator 来支持处理分布式事务,可以使用 BEgin distributed transaction 命令启动一个分布式事务处理


分二阶段:
A 准备阶段
B 提交阶段

执行教程:
1、sql 脚本或应用程序连接执行启动分布式事务的sql语句
2、执行该语句的sql在为事务中的主控服务器
3、脚本或应用程序对链接的服务器执行分布式查询,或对远程服务器执行远程存储过程。
4、当执行了分布式查询或远程过程调用后,主控服务器将自动调用msdtc以便登记分布式事务中链接的服务器和远程服务器
5、当脚本或应用程序发出commit或rollback语句时,主控sql将调用msdtc管理两阶段提交过程,或者通知链接的服务器和远程服务器回滚其事务。

posted @ 2008-10-27 16:42  玉玉  阅读(621)  评论(0编辑  收藏  举报