数据库的并发操作

  • 格式:pdf
  • 大小:765.32 KB
  • 文档页数:44

Specify the size and type of the locks to be used for a table Skip ead of shared locks
自定义锁超时
LOCK_TIMEOUT 设置允许应用程序设置语句等待 阻塞资源的最长时间 当语句等待的时间大于 LOCK_TIMEOUT 设置 时,系统将自动取消阻塞的语句,并给应用程序返 回"已超过了锁请求超时时段"的 1222 号错误信息 @@LOCK_TIMEOUT返回当前会话的当前锁超时 设置,单位为毫秒 SET LOCK_TIMEOUT 1800 GO
用户数据锁定的粒度
Table
Page
Page
Page
Row
Row
Row
锁的类型
Basic Locks
Shared Exclusive
Special Situation Locks
Intent Update Schema Bulk update
用户数据的锁类型 – 共享锁
当数据被读取的时候自动获得共享锁 可以应用到表, 页, 索引关键字或行. 对于同样的数据多个进程可以使用同一种共 享锁 没有进程可以在已经获取了共享锁的数据上 获得一个排它锁*
3 SQL Server 的锁
锁的作用 可锁定的资源 锁的类型 锁的兼容性 锁管理器
锁的作用
丢失或覆盖更新 未确认的相关性(脏读) 不一致的分析(非重复读) 幻像读
丢失或覆盖更新
T1 Read X (10) X=10 Read X (10) Compute X+=15 (25) X=20 Compute X+=10 Write X (20) Write X
死锁的发生--循环死锁的例子
-- Connection 1 -- Connection 2 begin tran update David01 set A='aa' where B='b2' waitfor delay '00:00:5' update David02 set D='d5' where E='e1' commit tran begin tran update David01 set A='aa' where B='b2' waitfor delay '00:00:5' update David02 set D='d5' where E='e1' commit tran
T2
Read X (25)
Transaction T2 seeing effects of transaction that was never committed
不可重复读取
T1 Read X (10) X=10 Read X (10) Commit Compute X+=15 (25) Write X X=25 Read X (25)
BEGIN TRANSACTION SELECT au_lname FROM authors WITH (updlock) GO BEGIN TRANSACTION SELECT au_lname FROM authors WITH (updlock) GO
用户数据的锁类型 – 特殊锁
三种特殊模式
表级别的锁定选项
Option HOLDLOCK SERIALIZABLE REPEATABLEREAD READCOMMITTED READUNCOMMITTED NOLOCK LOWLOCK PAGLOCK TABLOCK TABLOCKX READPAST UPDLOCK Description Control locking behavior for a table and override the locks that would be used to enforce the isolation level of the current transaction
Time
X=25 X=25
T2
Classic unsynchronized update
脏读
T1 Read X (10) X=10 Compute X+=15 (25) Write X X=25 Rollback
Time
X=10 Use value of X that was never committed to DB
Shared locks are compatible with all locks except exclusive Exclusive locks are not compatible with any other locks Update locks are compatible only with shared locks
嵌套事物的问题
显式事务可以嵌套,但不推荐 使用 @@trancount 决定嵌套的级别
SQL Server的事务类型
SQLServer的两类事务
显性事务(Default) 隐性事务
隐性事务
当执行特定语句时自动启动一个事务 事务必须显式的以 COMMIT 或 ROLLBACK TRANSACTION 结束
4 在 SQL Server 中自定义锁定
虽然SQL Server 2000 自动执行锁定,但 它仍可以通过以下方法自定义应用程序中 的锁定:
处理死锁和设置死锁优先级 处理超时和设置锁超时持续时间 设置事务隔离级别 对 SELECT,INSERT,UPDATE 和 DELETE 语句使用表级锁定提示 配置索引的锁定粒度
默认设置为 Off
SET IMPLICIT_TRANSACTIONS ON SET IMPLICIT_TRANSACTIONS ON
用户定义的事务的限制
下列语句不可以包含在显式事务中
ALTER DATABASE BACKUP LOG CREATE DATABASE DROP DATABASE RECONFIGURE RESTORE DATABASE RESTORE LOG UPDATE STATISTICS
Time
T2
Transaction sees only committed data but data changes when referenced multiple times
幻像
Jones,6 T1 Smith,4
Time
Insert Jones,6 Smith,4
Brewer,7 Select count (*) where rank > 3 (2)
死锁
死锁的发生 检测和结束死锁 处理死锁 将死锁减至最少
死锁的发生
死锁是一种可能发生在任何多线程系统中的状态
如果拥有线程需要获取另外一个资源,而该资源当前为 等待线程所拥有,则这种情形将成为死锁
死锁经常与正常阻塞混淆.当一个事务锁定了另一 个事务需要的资源,第二个事务等待锁被释放,第 二个事务被阻塞,而不是被死锁
处理死锁*
SQL Server 回滚作为死锁牺牲品的事务, 通知线程的应用程序(通过返回 1205 号错 误信息),取消线程的当前请求,然后允许 不间断线程的事务继续进行 SQL Server 通常选择运行撤消时花费最少 的事务的线程作为死锁牺牲品 用户可以使用 SET 语句将会话的 DEADLOCK_PRIORITY 设置为 LOW ,如 果会话的设置为 LOW ,则当会话陷入死锁 情况时将成为首选牺牲品
会话级别的锁定选项*
Transaction Isolation Level
READ COMMITTED (DEFAULT) READ UNCOMMITTED REPEATABLE READ SERIALIZABLE
Table-Level Locking Options Table-Level Locking Options
检测和结束死锁
死锁检测由一个称为锁监视器线程的单独的线程执 行,锁监视器线程对特定线程启动死锁搜索:
线程已经为同一资源等待了一段指定的时间.锁监视器 线程定期醒来并识别所有等待某个资源的线程.如果锁 监视器再次醒来时这些线程仍在等待同一资源,则它将 对等待线程启动锁搜索
当锁监视器对特定线程启动死锁检测时,它识别线 程正在等待的资源.然后,锁监视器查找特定资源 的拥有者,并递归地继续执行对那些线程的死锁搜 索,直到找到一个循环.用这种方式识别的循环形 成一个死锁. 在识别死锁后,SQL Server 通过自动选择可以打 破死锁的线程(死锁牺牲品)来结束死锁.
架构稳定性锁 – 当查询被编译的时候阻止其他 的进程获取架构修改锁 架构– 当将数据大容量复制到表或使用BCP命 令时修改锁 – 表结构修改的时候使用 大容量更新锁使用
锁的兼容性
Locks May or May Not Be Compatible with Other Locks Examples
Brewer,7 Select count (*) where rank > 3 (3)
T2
Transaction's input set defined by a predicate
Transaction should not see additions/deletions from input set Must prevent other transactions from inserting even if we don't see the effects!
可锁定的资源
Item RID Key Page Extent Table Database Description Row identifier Row lock within an index Data page or index page Group of pages Entire table Entire database