您的位置:首页 > 数据库

SQL SERVER2000教程-第七章 Transact-SQL编程 第五节 事务和锁

2007-10-01 15:54 441 查看


1. 事务概述
事务保证多个数据更改操作作为一个单位处理。
2. 事务的特性
(1)原子性:事务必须是完全成功或完全失败;
(2)一致性:事务必须强制招待所有数据一致性规则。
(3)隔离性:所有修改数据的事务都必须彼此隔离开来。
(4)永久性:事务所做的更改是永久而稳固的;
3. 事务的类型
A.显示事务:
事务开始和结束由用户显示的指定;
begin transaction 开始事务
commit tran 提交事务
rollback tran 回滚事务
B.隐式事务:
服务器自动启动并维护。
C.自动提交事务:
自动依据每个批次确立事务,如果某个批次回
滚不影响其他的批处理语句的执行;
例题:银行转帐
create proc proc_bank
@accounts1 char(4),@accounts2 char(4),@price int
AS
BEGIN
begin tran
update 帐户表 set 帐户余额=帐户余额-@price where 帐号=@accounts1
if @@error<>0
rollback tran
update 帐户表 set 帐户余额=帐户余额+@price where 帐号=@accounts2
if @@error<>0
rollback tran
else
commit tran
END
4. 事务的隔离级别
(1)提交读:是SQLServer的默认模式。如果事务已提交,则该级别允许读取数据。
(2)未提交读:是最低的限制的隔离级别。这事务结束前可更改数据以及删除和添加行。
(3)可重复读:进行锁定,这样将只能添加行而不能更新数据。
(4)可串行读:整个数据集将被锁定, 其他用户将不能添加或更新。
5. 设置事务的隔离级别
Set Transction Isolation Level {Read Committed|Read Uncommitted|Repeatable Read|Serializable}
READ COMMITTED
指定在读取数据时控制共享锁以避免脏读,但数据可在事务结束前更改,从而产生不可重复读取或幻像数据。该选项是 SQL Server 的默认值。
READ UNCOMMITTED
执行脏读或 0 级隔离锁定,这表示不发出共享锁,也不接受排它锁。当设置该选项时,可以对数据执行未提交读或脏读;在事务结束前可以更改数据内的数值,行也可以出现
在数据集中或从数据集消失。该选项的作用与在事务内所有语句中的所有表上设置 NOLOCK 相同。这是四个隔离级别中限制最小的级别。
REPEATABLE READ
锁定查询中使用的所有数据以防止其他用户更新数据,但是其他用户可以将新的幻像行插入数据集,且幻像行包括在当前事务的后续读取中。因为并发低于默认隔离级别,所
以应只在必要时才使用该选项。
SERIALIZABLE
在数据集上放置一个范围锁,以防止其他用户在事务完成之前更新数据集或将行插入数据集内。这是四个隔离级别中限制最大的级别。因为并发级别较低,所以应只在必要时
才使用该选项。该选项的作用与在事务内所有 SELECT 语句中的所有表上设置 HOLDLOCK 相同。
脏读:包含未提交数据的读。 例如,事务1 更改了某行。事务2 在事务1 提交更改之前读取已更改的行。如果事务1 回滚更改,则事务2 便读取了逻辑上从未存在过的行。
不可重复读取: 当某个事务不止一次读取同一行,并且一个单独的事务在两次(或多次)读取之间修改该行时。因为在同一个事务内的多次读取之间修改了该行,所以每次读
取都生成不同值,从而引发不一致问题
幻像:通过一个任务,在以前由另一个尚未提交其事务的任务读取的行的范围中插入新行或删除现有行。带有未提交事务的任务由于该范围中行数的更改而无法重复其原始读
取。如果某个连接设置其事务隔离级别为可串行,则 SQL Server 使用键范围锁定以防止幻像。
6. 死锁处理
死锁概念:
在多用户环境下,当不同用户分别锁定一个资源之后,双方都等待对方释放它所锁定的资源时,就产生一个锁定请求环,
从而出现死锁现象。
事务会对访问或更改的数据加锁。
可以通过强制任务释放锁:
Set deadlock_priority{low|normal}
(如果您将一个任务的优先级设为Low,SQL Server将在死锁的情况下强制该任务释放锁)

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: