Locks
Use
原理上,多个进程可以在同一时间获得相同的数据库对象,比如同一个表。数据库系统使用锁同步并行操作和隔离单独的进程。
锁的类型:
Name | Objects that can be locked |
Shared lock (SHARE LOCK) 共享锁 | 表、行、数据库目录 |
Exclusive lock (EXCLUSIVE LOCK) 排他锁 | 表、行、数据库目录 |
行 |
Activities
请求锁
行级或者表级的锁可以通过数据库系统被隐式的请求或者释放,或者显示的被用户请求或者释放。对数据库目录的锁都是通过数据库系统隐式的请求和释放的。
可以使用隔离级别决定什么时候什么类型的锁被设置,决定进程的并行度和将会出现的现象。可以在数据库的session启动的时候定义隔离级别,如果没有定义,则使用默认值。
依赖于隔离级别,数据库系统在执行sql语句的时候申请必须的锁。Sql语句在执行改变数据的操作(insert、update、delete)的时候进程申请一个排他锁。
使用锁语法,也可以显示的为进程或者表中单独的行申请锁,通过在sql语句中定义一个LOCK选项,这个可以在任何的隔离级别,可以使用LOCK选项临时的为某些sql语句覆盖隔离级别。
如果同一个进程在一个表中申请了太多的行级锁,数据库系统会试图设置一个表级锁在该表上,可以定义在有多少行级锁的时候系统转换成表级锁,通过配置MAXLOCKS参数(普通数据库参数)。
释放锁
Type of Lock | Release |
通过使用LOCK语法显示的释放 | 数据库系统在进程结束的时候释放锁。除了以下的情况: COMMIT或者ROLLBACK命令执行结束进程并且包含一个LOCK语法。 |
隐式设置共享锁 | 依赖于隔离级别 |
隐式设置排他锁 变更行排他锁 通过SQL语句修改数据申请的排他锁 表锁 | 在进程中没有释放,但是在整个进程结束的时候释放 |
没有被修改的行上的排他锁 行上的共享锁 | 可以通过UNLOCK语法被释放 |
可以通过REQUEST_TIMEOUT(特别数据库参数)限制用户等待一个锁被释放的时间,当这个时间超时的时候,会产生一个数据库系统的提示,可以根据该提示进一步处理。
显示锁的信息
可以查看锁的信息:
LOCKS系统表包含了有关锁的信息;
LOCK_HOLDER系统表;
LOCK_REQUESTOR系统表
LOCK_WAITS包含了有关锁等待的信息。
(这些系统表的所有者是DOMAIN用户)
现象
如果很多的进程同时访问相同的数据库对象,比如表,会在结果集上出现互相矛盾的情况,会出现以下的现象:
脏读:
进程 T1修改一个行。进程T2在进程T1提交之前读这个行,然后T1执行了回滚操作,这个时候T2读取的数据实际上是不存在的。
不可重复读
进程T1读一个行,进程T2修改或者删除了该行且提交了进程。如果随后T1再读该行,则T1返回改变的行或者提示行不存在。
Phantom
进程T1执行一个有查找条件的SQL语法S,返回结果集M。进程T2增加或修改数据使至少一新行满足S的查找条件,如果T1再执行S,则新的结果集和M是不同的。
通过设置 隔离级别决定哪种现象是可以接受的:.
Relationship between the 隔离级别 and phenomena
Phenomena | 隔离级别 | |||
0 | 1 or 10 | 2 or 20 | 3 or 30 | |
Dirty Read | yes | no | no | no |
Non Repeatable Read | yes | yes | no | no |
Phantom | yes | yes | yes | no |
并行锁
下表显示在并行操作中存在哪些共享锁和排他锁:
A transaction has.. | ||||||
For a table | For a row | For the database catalog | ||||
Another transaction can... | Exclusive lock | Shared lock | Exclusive lock | Shared lock | Exclusive lock | Shared lock |
Request an exclusive lock for the table | no | no | no | no | no | yes |
Request a shared lock for the table | no | yes | no | yes | no | yes |
Request an exclusive lock for any row in the table | no | no | - | - | no | yes |
Request an exclusive lock for the locked row | - | - | no | no | - | - |
Request an exclusive lock for a different row | - | - | yes | yes | - | - |
Request a shared lock for any row in the table | no | yes | - | - | no | yes |
Request a shared lock for the locked row | - | - | no | yes | - | - |
Request a shared lock for a different row | - | - | yes | yes | - | - |
Change the definition of the table in the database catalog | no | no | no | no | no | no |
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/51862/viewspace-180645/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/51862/viewspace-180645/