SQL事务

数据库事务 (Database Transaction)笔记

1. 概述

a.概念:事务(Transaction)指作为单个逻辑工作单元执行的一系列操作(一组SQL语句的集合),该操作只能得到两个结果,即全部执行或一样也“不执行”;这里的“不执行”并非没有执行,而是指在执行的过程中由于某些原因(如:系统故障、突然断电、T-SQL语句集合中存在问题等),使得数据库未能全部执行这一系列操作,与全部执行的操作相比较,数据存在不一致,为了防止出现这样的情况,通过使用事务让其恢复到执行这一系列之前的状态。
.
b.作用:保持数据的一致性和完整性


2.事务的特性

a.原子性(Atomicity):事务以原子为工作单元,不可分割的;事务的操作要么全部执行,要么全部失败回滚,不能只执行一部分操作
.
b.一致性(Consistency):指数据在逻辑上的正确性;事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。例如:用户A和用户B的前加起来一共是5000; 无论AB用户之间是如何相互转换的,事务结束后两个用户的钱加起来还是5000,这就是事务的一致性。
.
c.隔离性(Isolation):一个事务在执行过程中不能被其它事物干扰。即一个事物内部的操作及使用的数据对其它并发事物是隔离的,并发执行的各个事物之间不能互相烦扰。当多个用户并发(同时)访问数据库时,数据库为每一个用户开启的事务,不被其他事务的操作所干扰,多个并发事务之间要相互隔离。
d.持久性(Durability):一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便在数据库系统遇到故障的情况下也不会丢失事物的操作。


3.事务类型

a.显示事务:显示定义了事务的开始与结束,即个事务均以begin tran|transaction语句显式开始,以commit tran|transaction或 rollback tran|transaction语句显式结束。在使用了set xact_abort on,当执行到错误的T-SQL语句时事务终止并回滚。使用了set xact_abort off,当执行到错误的T-SQL语句时,有时只会滚产生错误的T-SQL语句,事务将继续执行;若错误较为严重,可能回滚整个事务
b.隐式事务:必须使用set implicit_transactions on语句启动隐式事务,当一个事务结束,该模式会自动启用(自动启动事务的语句有:alter、create、delete、drop、fetch、grant、insert、open、revoke、select、truncate、table、update)下一个事务,只用Commit Transaction 提交事务、Rollback Transaction 回滚事务即可。希望结束隐式事务用set implicit_transactions off。由于隐式事务会占用大量资源,一般都不推荐使用
c.自动提交事务:SQL Server默认的事务管理事务。每条单独的T-SQL语句都是一个事务


4.事务工作机制

遇到begin tran开始事务,执行T-SQL语句集合,每执行成功一个语句就记录事务日志,当遇到了comit tran时,日志页写入数据库的日志设备上(文件)


5.编写事务

编写事务的原则:编写的事务尽可能简短,以减少并发连接间的资源锁定争夺;灵活使用更低的事务隔离级别;不在事务处理期间要求用户输入

a.编写显示事务

use DataBaseName
go
set set xact_abort on
declare @TransactionName varchar(20),@SavePointName1 varchar(20),@SavePointName2 varchar(20)
set @TransactionName=‘T’
begin tran
insert…
update…
save tran @SavePointName1

end tran
begin catch
select
Error_number() as ErrorNumber, --错误代码
Error_severity() as ErrorSeverity, --错误严重级别,级别小于10 try catch 捕获不到
Error_state() as ErrorState , --错误状态码
Error_Procedure() as ErrorProcedure , --出现错误的存储过程或触发器的名称。
Error_line() as ErrorLine, --发生错误的行号
Error_message() as ErrorMessage --错误的具体信息
if(@@trancount>0) --全局变量@@trancount,事务开启此值+1,他用来判断是有开启事务
rollback tran —由于出错,这里回滚到开始,第一条语句也没有插入成功。
end catch
if @@trancount>0
commint tran @TransactionName
go

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值