事务
事务定义:
事务是单个的工作单元。如果某一事务成功,则在该事务中进行的所有数据更改均会
提交,成为数据库中的永久组成部分。如果事务遇到错误且必须取消或回滚,则所有
数据更改均被清除。
事务三种运行模式:
自动提交事务 每条单独的语句都是一个事务。 显式事务 每个事务均以 begin transaction 语句显式开始, 以 commit 或 rollback 语句显式结束。 隐性事务 在前一个事务完成时新事务隐式启动,但每个事务仍以 commit 或 rollback 语句 显式完成。
事务操作的语法:
begin transaction
begin distributed transaction commit transaction commit work rollback work save transaction begin transaction begin transaction begin transaction将 @@trancount 加 1。 begin transaction 代表一点,由连接引用的数据在该点是逻辑和物理上都一致的。如果遇上错误,在 begin transaction 之后的所有数据改动都能进行回滚,以将数据返回到已知的一致状态 。每个事务继续执行直到它无误地完成并且用 commit transaction 对数据库作永久的改动,或者遇上错误并且用 rollback transaction 语句擦除所有改动 语法 例子:
begin distributed transaction 语法 参数 @tran_name_variable 注释 当连接发出后续 commit transaction 或 rollback transaction 语句时, 分布式事务中已登记的连接执行一个远程存储过程调用,该调用引用一个远程服务器。 示例 说明 use pubs set xact_abort ( 可以比较简单的理解,如果中间有任何一句sql 出错,所有sql全部回滚.特别适用于 procedure 中间调用procedure ,如果第一个procedure ok,被调用的procedure 中间有错误,如果set xact_abort=false,则出错的部分回滚,其他部分提交,当然外部procedure 也提交。). ---在分布式trans中一定要注意设置下面参数(xact_abort) 语法set xact_abort { on | off } 注释 当 set xact_abort 为 on 时,如果 transact-sql 语句产生运行时错误,整个事务将终止并回滚。为 off 时,只回滚产生错误的transact-sql 语句,而事务将继续进行处理。编译错误(如语法错误)不受 set xact_abort 的影响。 对于大多数 ole db 提供程序(包括 sql server),隐性或显式事务中的数据修改语句必须将 xact_abort 设置为 on。 set xact_abort 的设置是在执行或运行时设置,而不是在分析时设置。 示例 下例导致在含有其它 transact-sql 语句的事务中发生违反外键错误。在第一个语句集中产生错误,但其它语句均成功执行且事务成功 create table t1 (a int primary key)
save transaction 语法 save tran [ saction ] { savepoint_name | @savepoint_variable } note:1: 在由 begin distributed transaction 显式启动或从本地事务升级而来的分布式事务中,不支持 save transaction。 2:当事务开始时,将一直控制事务中所使用的资源直到事务完成(也就是锁定)。当将事务的一部分回滚到保存点时,将继续控制资源直到事务完成(或者回滚全部事务)。 例子:begin transaction
rollback transaction 将显式事务或隐性事务回滚到事务的起点或事务内的某个保存点。 参数 注释 rollback transaction 清除自事务的起点或到某个保存点所做的所有数据修改。rollback 还释放由事务控制的资源。 note: 在存储过程中,不带 savepoint_name 和 transaction_name 的 rollback transaction 语句将所有语句回滚到最远的 begintransaction。在存储过程中,rollback transaction 语句使 @@trancount 在触发器完成时的值不同于调用该存储过程时的@@trancount 值,并且生成一个信息。该信息不影响后面的处理。 如果在触发器中发出 rollback transaction:将回滚对当前事务中的那一点所做的所有数据修改,包括触发器所做的修改。 rollback transaction 语句不生成显示给用户的信息。如果在存储过程或触发器中需要警告,请使用 raiserror 或 print 语句。raiserror 是用于指出错误的首选语句。 rollback 对游标的影响由下面三个规则定义: 权限 begin transaction -- select * into demo2 from demo1 create table demo2(name varchar(10),age int) commit transaction
标志一个成功的隐性事务或用户定义事务的结束。如果 @@trancount 为 1,commit transaction 使得自从事务开始以来所执行的 所有数据修改成为数据库的永久部分,释放连接
占用的资源,并将 @@trancount 减少到 0。如果@@trancount 大于 1,则commit
transaction 使 @@trancount 按 1 递减。
只有当事务所引用的所有数据的逻辑都正确时,发出 commit transaction 命令。
commit work 标志事务的结束。 语法 commit [ work ] 注释
此语句的功能与 commit transaction 相同,但 commit transaction 接受用户定义的事务 名称。这个指定或没有指定可选关键字work 的 commit 语法与 sql-92 兼容
例子:
begin transaction a insert into demo values('bb','b term') commit transaction a 隐性事务
当连接以隐性事务模式进行操作时,sql server将在提交或回滚当前事务后自动启动新事务。无须描述事务的开始,只需提交或 回滚每个事务。隐性事务模式生成连续的事务链。
在为连接将隐性事务模式设置为打开之后,当 sql server 首次执行下列任何语句时,都会自动启动一个事务:
在发出 commit 或 rollback 语句之前,该事务将一直保持有效。在第一个事务被提交或回滚之后,下次当连接执行这些语句
中的任何语句时,sql server 都将自动启动一个新事务。sql server 将不断地生成一个隐性事务链,
直到隐性事务模式关闭为止
例子:
begin transaction save transaction a insert into demo values('bb','b term')
rollback transaction a create table demo2(name varchar(10),age int)
insert into demo2(name,age) values('lis',1) rollback transaction -- 在 create table demo2 时 sql server 已经隐式创建一个trans,知道提交或回滚 嵌套事务处理:
1: trans 嵌套,将内部的trans 合并到外部并形成一个trans.
begin tran t1
----in the first trans .
insert into demo2(name,age) values('lis',1) ---second trans begin transaction t2
insert into demo values('bb','b term') commit transaction t2 ----in the first trans .
insert into demo2(name,age) values('lis',2) rollback transaction t1 note:
在一系列嵌套的事务中用一个事务名给多个事务命名对该事务没有什么影响。系统仅登记第一个(最外部的)事务名。回滚
到其它任何名字(有效的保存点名除外)都会产生错误。
事实上,任何在回滚之前执行的语句都没有在错误发生时回滚。这语句仅当外层的事务回滚时才会进行回滚。
例:内部事务回滚sql server 报错。
begin tran t1
insert into demo2(name,age) values('lis',1) ---second trans --server: msg 6401, level 16, state 1, line 6
---cannot roll back t2. no transaction or savepoint of that name was found. begin transaction t2 insert into demo values('bb','b term') rollback transaction t2 ----in the first trans . insert into demo2(name,age) values('lis',2) commit transaction t1 例: 内部事务提交sql server 不会报错。
begin tran t1
insert into demo2(name,age) values('lis',1) ---second trans no error begin transaction t2 insert into demo values('bb','b term') commit transaction t2 ----in the first trans . insert into demo2(name,age) values('lis',2) commit transaction t1 sql server 的隔离级别:
1: 设置timeout 参数 set lock_timeout 5000 被锁超时5秒将自动解锁 set lock_timeout 0 产立即解锁,返回error 默认为-1,无限等待 2:
(set transaction isolation level
read committed 指定在读取数据时控制共享锁以避免脏读,但数据可在事务结束前更改,从而产生不可重复读取或 幻像数据。该选项是sql server 的默认值。
避免脏读,并在其他session 在事务中不能对已有数据进行修改。共享锁。
read uncommitted 执行脏读或 0 级隔离锁定,这表示不发出共享锁,也不接受排它锁。当设置该选项时,可以对数 据执行未提交读或脏读;在事务结束前可以更改数据内的数值,行也可以出现在数据集中或从数据 集消失。该选项的作用与在事务内所有语句中的所有表上设置 nolock 相同。这是四个隔离级别中 限制最小的级别。
repeatable read 锁定查询中使用的所有数据以防止其他用户更新数据,但是其他用户可以将新的幻像行插入数据 集,且幻像行包括在当前事务的后续读取中。因为并发低于默认隔离级别,所以应只在必要时才使 用该选项。
serializable 在数据集上放置一个范围锁,以防止其他用户在事务完成之前更新数据集或将行插入数据集内。这 是四个隔离级别中限制最大的级别。因为并发级别较低,所以应只在必要时才使用该选项。该选项 的作用与在事务内所有 select 语句中的所有表上设置 holdlock 相同。 商业源码热门下载www.html.org.cn |