失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > sqlsever回滚操作_SqlServer 事务回滚(1)

sqlsever回滚操作_SqlServer 事务回滚(1)

时间:2020-06-29 03:18:52

相关推荐

sqlsever回滚操作_SqlServer 事务回滚(1)

SQL事务

一、事务概念

事务是一种机制、是一种操作序列,它包含了一组数据库操作命令,这组命令要么全部执行,要么全部不执行。因此事务是一个不可分割的工作逻辑单元。在数据库系统上执行并发操作时事务是作为最小的控制单元来使用的。这特别适用于多用户同时操作的数据通信系统。例如:订票、银行、保险公司以及证券交易系统等。

二、事务属性

事务4大属性:

1 原子性(Atomicity):事务是一个完整的操作。

2 一致性(Consistency):当事务完成时,数据必须处于一致状态。

3 隔离性(Isolation):对数据进行修改的所有并发事务是彼此隔离的。

4 持久性(Durability):事务完成后,它对于系统的影响是永久性的。

三、创建事务

T-SQL中管理事务的语句:

1 开始事务: begin transaction

2 提交事务:commit transaction

3 回滚事务: rollback transaction

事务分类:

1 显式事务:用begin transaction明确指定事务的开始。

2 隐性事务:打开隐性事务:set implicit_transactions on,当以隐性事务模式操作时,SQL Servler将在提交或回滚事务后自动启动新事务。无法描述事务的开始,只需要提交或回滚事务。

3 自动提交事务:SQL Server的默认模式,它将每条单独的T-SQL语句视为一个事务。如果成功执行,则自动提交,否则回滚。

USE[TestDB]

GO

/******对象:Table[dbo].[Person]脚本日期:11/23/13:37:48******/

SETANSI_NULLSON

GO

SETQUOTED_IDENTIFIERON

GO

CREATETABLE[dbo].[Person](

[PersonId][nchar](18)NOTNULL,

[PersonName][nchar](20)NOTNULL,

CONSTRAINT[PK_Person]PRIMARYKEYCLUSTERED

(

[PersonId]ASC

)WITH(PAD_INDEX=OFF,STATISTICS_NORECOMPUTE=OFF,IGNORE_DUP_KEY=OFF,ALLOW_ROW_LOCKS=ON,ALLOW_PAGE_LOCKS=ON)ON[PRIMARY]

)ON[PRIMARY]

默认情况下如果执行一个事务中出现错误,则只回滚错误操作语句(就是说这句不执行了,算不上回滚),错误处之前或之后的正确操作语句还是会被提交。如:

UseTestDB

BeginTransAction

InsertIntoPerson(PersonId,PersonName)

Values('1','Name1')

InsertIntoPerson(PersonId,PersonName)

Values('1','Name1')

InsertIntoPerson(PersonId,PersonName)

Values('3','Name3')

CommitTransAction

/*

Select一下有'1','Name1'和'3','Name3',

说明只有第二句的错误被取消了

*/

全部回滚的方法1:打开 XACT_ABORT

UseTestDB

SETXACT_ABORTON--打开

BeginTransAction

InsertIntoPerson(PersonId,PersonName)

Values('1','Name1')

InsertIntoPerson(PersonId,PersonName)

Values('1','Name1')

InsertIntoPerson(PersonId,PersonName)

Values('3','Name3')

CommitTransAction

/*

当SETXACT_ABORT为ON时,

如果执行Transact-SQL语句产生运行时错误,

则整个事务将终止并回滚。

默认情况下它是OFF状态。

*/

全部回滚方法2:使用Try...Catch

UseTestDB

BeginTry

BeginTransAction

InsertIntoPerson(PersonId,PersonName)

Values('1','Name1')

InsertIntoPerson(PersonId,PersonName)

Values('1','Name1')

InsertIntoPerson(PersonId,PersonName)

Values('3','Name3')

CommitTransAction

EndTry

BeginCatch

RollbackTransAction

EndCatch

/*

使用Try

Catch来捕获异常。

如果TRY块内生成的错误导致当前事务的状态失效,

则将该事务归类为不可提交的事务。

如果通常在TRY块外中止事务的错误在TRY内发生时,

就会导致事务进入不可提交状态。

不可提交的事务只能执行读操作或ROLLBACKTRANSACTION。

该事务不能执行任何可能生成写操作或COMMITTRANSACTION的Transact-SQL语句。

如果事务被分类为不可提交的事务,则XACT_STATE函数会返回值-1。

*/

全部回滚方法3:自定义错误变量

UseTestDB

Declare@tranErrorint--定义变量

Set@tranError=0

BeginTransAction

InsertIntoPerson(PersonId,PersonName)

Values('1','Name1')

Set@tranError=@tranError+@@Error

InsertIntoPerson(PersonId,PersonName)

Values('1','Name1')

Set@tranError=@tranError+@@Error

InsertIntoPerson(PersonId,PersonName)

Values('3','Name3')

Set@tranError=@tranError+@@Error

If@tranError=0

CommitTransAction

Else

RollbackTransAction

/*

自定义一个变量来判断最后是否发生过错误。

*/

最后要注意的是:如果一个事务写了BeginTransAction而没写CommitTransAction或RollbackTransAction则相关操作的数据(也许是表,也许是列,这我还没测试。。。)会被锁住。。。而对于锁住的解决办法就是单独执行一下CommitTransAction或RollbackTransAction

本文转载

如果觉得《sqlsever回滚操作_SqlServer 事务回滚(1)》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。