-- =========================================================================================
-- 2007/06/06 SQL学习-- 事务
-- =========================================================================================
use test
go
--
-- ******************************************************************************************
-- ===================================================================================================
-- 事务与锁
-- 事务(Transaction)的作用是保证一系列的数据操作可以全部正确完成,不会造成数据操作到一半未完成,
-- 而导致数据的完整性出错。
-- 锁(Lock)的作用是保证数据在操作的过程中不会受到任何的其他影响。
-- ===================================================================================================
-- 事务是作为单个逻辑工作单元执行的一系列工作。必须具备的四个特性:
-- 1)原子性
-- 2)一致性
-- 3)隔离性:由并发事务所作的修改必须与其他并发事务所作的修改隔离。
-- 4)持久性:在事务完成后,其操作结果对于系统的影响应该是永久的。
--
-- ===================================================================================================
select * from authers
select * from books
delete authers
where author_id = 4
delete books
where book_id = 8
--
-- 开始事务
begin tran
declare @bid int
-- 添加一本书
insert books
values ( 8 , ' ADO.NET ' , 4 , 300 )
if @@error > 0
goto tranrollback
set @bid = @@identity
-- 添加一个作者
insert authers
(author_id,lastname,firstname,company)
values ( 4 , ' bin ' , ' song ' , ' 21CNIT ' )
-- print '添加成功 !'
if @@error > 0
goto tranrollback
--
tranrollback:
if @@error > 0 or @@rowcount <> 1
rollback tran -- 如果发生错误则回滚事务
else
commit tran -- 如果没有发生错误则提交事务
go
--
-- 事务的执行方式分为三种:
-- 1)显式事务
-- 2)自动提交事务(默认的方式)
-- 每一个T-SQL语句都是一个自动提交的事务
-- 3)隐式事务
-- 当执行 set implicit_transactions on 语句后,进入隐式模式
-- 隐式事务产生的是一个连续的事务链
-- =================================================================================================
-- 编写事务的原则:
-- 1)事务要尽可能简短
-- 2)在事务中访问的数据量要尽量最少
-- 3)浏览数据时尽量不要打开事务
-- 4)在事务处理期间尽量不要请求用户输入
-- 编写事务
--
select * from books
-- 事务开始
begin tran
--
insert books
(book_id,title)
values ( 10 , ' wo ' )
if @@error > 0 or @@rowcount <> 1
goto tranrollback
--
insert books
(book_id,title)
values ( 11 , ' me ' )
if @@error > 0 or @@rowcount <> 1
goto tranrollback
--
select * from books
--
delete books
where book_id = 15
if @@error > 0 or @@rowcount <> 1
begin
tranrollback:
rollback tran -- 回滚事务
end
else
commit tran
-- 事务结束
-- 查看事务结束后的数据集
select * from books
-- 嵌套事务
-- 嵌套事务里并不是将嵌套的语句完全执行完毕,嵌套事务会将内层事务的commit语句忽略,只提交最外层事务的commit语句
-- 在内层事务里,rollback语句仍然有效,但只是回滚到外层事务开始之前的状态
--
begin tran
print '