SQL Server事务

事务的特性

原子性:要么全部执行,要么全部不执行。

一致性:事务完成时,所有的数据都保持一致状态。

隔离性:一个并发事务要么修改另一个事务之前的状态,要么修改它之后的状态,不能在该事务运行时去修改的它的状态。

持久性:事务成功提交后,不能在次回滚到提交前的状态了。

 

事务以“begin tran”语句开始,以“commit tran”或“rollback tran”语句结束。

 

事务执行时注意事项

u 每个操作之后都要检查@@ERROR@@ROWCOUNT的值。@ERROR:当前一个语句遇到错误,则返回错误号,否则返回0;@@ROWCOUNT:返回上一语句受影响的行数。在每一条语句执行后至两个变量都会被立刻重置。当没有符合条件的记录时,那么所影响的记录数为0,但不出错,所以@@ERROR的值也为0

 

u 无法回滚的语句不能在事务中使用,以下是不能使用在事务中的语句:

create databasealert databasedrop databaseload databaserestore databasebackup logrestore logload transactiondump transactiondisk initreconfigureupdate statistics

 

事务的工作原理

事务开始时,SQL Server就会将要修改的数据锁定,同时创建一个临时的事务日志,在该临时的事务日志里存放更改的数据和更改的过程。在事务未提交时,事务中所有的数据操作是临时的,一旦发生数据操作失败,就使用临时日志里的数据去回滚事务操作,并解除锁定。事务被成功提交后,数据库就将临时事务日志的内容存储到数据库的事务当中去,此时事务操作完成。

 

事务执行的模式

 

显示事务:明确定义事务的开始和结束,显示事务是以“begin tran”语句开始,以“commit tran”或“rollback tran”语句结束的事务。

隐式事务:隐式事务是指系统在提交或回滚事务后自动启动的事务,隐式事务产生的是一个连续的事务链,当执行“SET IMPLICIT_TRANSACTIONS ON”语句后,SQL Server进入隐式事务模式,执行“SET IMPLICIT_TRANSACTIONS OFF”才结束隐式事务模式。

在隐式事务模式下会自动启动事务的语句:

alter tablecreateopeninsertselectupdatedeletedroptruncate tablefetchgrantrevoke

自动提交事务:是SQL Server Database Engine的默认事务方式,在没有明确定义事务的开始和接受时,只要一出错,也会回滚到未执行前的状态。

自动提交事务的语句:

alter tabletruncate tablecreateselectinsertupdatedeletedropopenfetchrevokegrant

 

事务编写遵循的原则

l 事务要尽可能简短

l 事务中涉及的数据量要尽量少

l 浏览数据时尽量不要打开事务

l 事务处理期间尽量不要请求用户输入

数据库管理系统会在事务结束之前保留很多资源,以保证事务的原子性、一致性、隔离性和持久性。当事务需要修改数据时,系统会使用锁来保护修改过的记录,此时其他事务不能对这些记录进行操作,直到事务结束。在多用户系统中,大资源的占有和长时间的锁定是不能忍受的。

嵌套事务的注意事项

嵌套事务只提交最外层事务的commit语句,而嵌套的内层事务里的commit是没有意义的,但是也不能将其省略,因为事务是以commitrollback语句作为结束标志的;内层事务里的rollback语句仍然有效,但事务的回滚是回滚到最外层事务开始之前的状态(如果要内层事务要回滚到内层事务开始之前,可以使用事务保持点)。

 

获取嵌套的层次:使用全局变量@@TRANCOUNT获取当前代码所在层次。

 

事务保持点

SQL Server 2008中,为事务提供了一个“事务保存点”,用来保存事务当前所在位置,设置好了事务保持点之后,可以让事务回滚到保存点时的状态。

设置事务保存点的代码如下:

save { tran | transaction } { savepoint_name | @savepoint_vatiable}

回滚代码如下:

rollback { tran | transaction } { savepoint_name | @savepoint_vatiable}

备注:savepoint_name为保存点名称,@savepoint_variable为保存点名称的变量。

 

事务的隔离级别

事务具有隔离性,当事务处理数据时将数据锁定可以防止其他事务影响当前操作,这样一来,其他事务就要排队等待,从而影响数据库的使用效率。有时几个事务同事锁定自己的数据,同时又等待其他事务释放数据,造成死锁。

SQL Server 2008中,事务级别由低到高分为5个级别:

Read Uncommitted

Read Committed

Repeatable Read

Snapshot

Serializable

更改事务的隔离级别的语法代码:

set transaction isolation level

{ read uncommitted

| read Committed

| Repeatable Read

| Snapshot

| Serializable

}[ ; ]

 

事务代码示例:

--一、编写事务

use DB

begin tran 

 

insert S(sname,age,sex,department) values('张小','21',1,'计算机')

if @@error>0

goto tranroolback

 

--这里的性别不符合约束条件,会出错

insert S(sname,age,sex,department) values('李四','21','','计算机')

if @@error>0

goto tranroolback

 

tranroolback:--自定义名称

if @@error>0 or @@rowcount<>1

rollback tran

else

commit tran

 

select * from S

----------------------------------------------------------------------------------------------------------------------

--二、嵌套事务

use DB

begin tran 

 

insert S(sname,age,sex,department) values('张小','21',1,'计算机')

if @@error>0

goto tranroolback

 

insert S(sname,age,sex,department) values('李四','21',0,'计算机')

if @@error>0

goto tranroolback

 

--嵌套开始

begin tran

insert S(sname,age,sex,department) values('王五','21',0,'计算机')

if @@error>0 or @@rowcount<>1

rollback tran

else

commit tran

--嵌套结束

 

tranroolback:

if @@error>0

rollback tran

else

commit tran

 

select * from S

posted @ 2015-09-16 14:48  一天一夜  阅读(196)  评论(0编辑  收藏  举报