sql 事务 Transaction(含常用全局变量)
说明
将若干条 SQL 语句“打包”在一起,共同执行一个完整的任务,就是事务。
事务由一条或者多条 SQL 语句构成。
事务有一个最显著的特征,就是它包含的所有 SQL 语句作为一个整体向数据库提交,只有所有的 SQL 语句都执行完成,整个事务才算成功,一旦某个 SQL 语句执行失败,整个事务就失败了。事务失败后需要回滚所有的 SQL 语句。
事务中的所有 SQL 语句是一个整体,要么全部执行成功,要么全部执行失败。
属性
原子性
一个事务中的所有 SQL 语句,要么全部执行成功,要么全部执行失败,不会结束在中间的某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
一致性
在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的数据必须完全符合所有的预设规则,其中包含数据的精确度、串联性以及后续数据库可以自发性地完成预定的工作。
隔离性
数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。
持久性
事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
常用流程
Begin Transaction:事务开始。
Commit Transaction:事务提交。
Rollback Transaction:回滚事务。
Save Transaction:事务保存点。
xact_abort on/off : 是否回滚当前事务,为on时如果当前sql出错,回滚整个事务,为off时如果sql出错回滚当前sql语句,其它语句照常运行读写数据库。
示例
drop TABLE sal_order_testLog
drop TABLE sal_order_test
CREATE TABLE sal_order_test
(FID INT IDENTITY (1,1),
FBILLNO VARCHAR(200) NOT NULL DEFAULT(''),
FDATE VARCHAR(200) NOT NULL DEFAULT('')
)
CREATE TABLE sal_order_testLog
(FID INT IDENTITY (1,1),
Direction VARCHAR(2000) NOT NULL DEFAULT(''),
FDATE VARCHAR(200) NOT NULL DEFAULT('')
)
select *from sal_order_testLog
select *from sal_order_test
begin tran ---开启事务
--set xact_abort off
begin try
insert into sal_order_test (FBILLNO,FDATE) values ('xsdd001',CONVERT(varchar,GETDATE(),21))
save tran saveIndex --加入保存点
--insert into sal_order_test (FBILLNO,FDATE) values (CONVERT(int,0),GETDATE()) --错误类型,出错
end try
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)
rollback tran saveIndex --回滚到保存点
if(@@ERROR>0) --全局变量@@ERROR,判断错误
begin
rollback tran --事务回滚
insert into sal_order_testLog (Direction,FDATE) select '执行失败',CONVERT(varchar,GETDATE(),21) --写入日志
end
else
begin
commit tran --提交事务
insert into sal_order_testLog (Direction,FDATE) select '执行成功',CONVERT(varchar,GETDATE(),21) --写入日志
end
go
--表本身为空表,ID ,FDATE为int 类型,其它为nvarchar类型
select * from sal_order_test
select * from sal_order_testLog
select @@LANGUAGE as '当前使用语言'
select @@SERVERNAME as '当前服务器名称'
select @@TRANCOUNT as '当前连接打开的事务数'
select @@MAX_CONNECTIONS as '可以同时连接的最大数目'
select @@VERSION as '当前服务器版本'
select @@ERROR as '最后一个T-SQL错误的错误号'
常用全局变量
2、本资源部分来源其他付费资源平台或互联网收集,如有侵权请联系及时处理。
SEA模板网 » sql 事务 Transaction(含常用全局变量)
发表评论