数据库锁机制

来源:互联网 发布:月经 饮食 知乎 编辑:程序博客网 时间:2024/06/09 03:42

一 、乐观锁和悲观锁

【悲观锁】
所谓悲观锁就是基于数据库机制实现的。
比如在在使用select子句的时候加上for update,
那么直到改子句的事务结束为止,任何应用都无法修改select出来的记录。

【乐观锁】
所谓乐观锁是基于应用的版本机制来实现的。
数据库中帐户信息表中有一个 version字段,当前值为1;而当前帐户余额字段(balance)为$100。 
1、操作员A 此时将其读出(version=1),并从其帐户余额中扣除$50 ($100-$50)。 
2、在操作员A操作的过程中,操作员B也读入此用户信息(version=1),并从其帐户余额中扣除$20($100-$20)。 
3、操作员A完成了修改工作,将数据版本号加一(version=2),连同帐户扣除后余额(balance=$50),提交至数据库更新,此时由于提交数据版本大于数据库记录当前版本,数据被更新,数据库记录version更新为2。 
4、操作员B完成了操作,也将版本号加一(version=2)试图向数据库提交数据(balance=$80),但此时比对数据库记录版本时发现,操作员B提交的数据版本号为2,数据库记录当前版本也为2,不满足“提交版本必须大于记录当前版本才能执行更新“的乐观锁策略,
因此,操作员B 的提交被驳回。这样就避免了操作员B 用基于version=1 的旧数据修改的结果覆盖操作员A的操作结果的可能。
乐观锁机制避免了长事务中的数据库加锁开销(操作员A 和操作员B操作过程中,都没有对数据库数据加锁),大大提升了大并发量下的系 统整体性能表现。

乐观锁、悲观锁 是从是否锁数据方面进行分类。

共享锁、排它锁是从 锁的类型进行分类。

转载:http://blog.sina.com.cn/s/blog_548bd2090100ir7k.html

读锁 写锁 共享锁 排它锁 悲观锁 乐观锁

二、排它锁和共享锁
在数据库中有两种基本的锁类型:排它锁(Exclusive Locks,即X锁)和共享锁(Share Locks,即S锁)。
当数据对象被加上排它锁时,其他的事务不能对它读取和修改。加了共享锁的数据对象可以被其他事务读取,但不能修改。
数据库利用这两种基本的锁类型来对数据库的事务进行并发控制。

三、表级锁和行级锁
DML锁的目的在于保证并发情况下的数据完整性,主要包括TM锁和TX锁,其中TM锁称为表级锁,TX锁称为事务锁或行级锁。
当Oracle执行DML语句时,系统自动在所要操作的表上申请TM类型的锁。当TM锁获得后,系统再自动申请TX类型的锁,并将实际锁定的数据行的锁标志位进行置位。
这样在事务加锁前检查TX锁相容性时就不用再逐行检查锁标志,而只需检查TM锁模式的相容性即可,大大提高了系统的效率。
TM锁包括了SS、SX、S、X等多种模式,在数据库中用0-6来表示。不同的SQL操作产生不同类型的TM锁。


2 SS(ROW-S)行级共享锁
其他对象只能查询这些数据行 SELECT FOR UPDATE、LOCK FOR UPDATE、
LOCK ROW SHARE
3 SX(ROW-X) 行级排它锁
在提交前不允许做DML操作 INSERT、UPDATE、DELETE、

转载:http://blog.sina.com.cn/s/blog_95b5eb8c0101i22x.html

其他概念:锁的多粒度性以及锁升级 

重入锁

sql组成:
DDL:数据库模式定义语言,关键字:create
DML:数据操纵语言,关键字:Insert、delete、update
DCL:数据库控制语言 ,关键字:grant、remove
DQL:数据库查询语言,关键字:select

0 0