Oracle数据库中的锁机制
数据库锁机制

数据库锁机制 数据并发会引起很多问题,数据库通过锁机制来解决并发访问的问题,虽然不同的数据库在实现细节上存在差别,但是原理都差不多,下⾯介绍⼀下数据库的锁机制 按锁定的对象不同分为表锁定和⾏锁定,表锁定对整个表进⾏锁定,⾏锁定针对特定的⾏进⾏锁定,从并发事务锁定的关系上看,可以分为共享锁定和独占锁定,共享锁定会防⽌独占锁定,允许其他的共享锁定,⽽独占锁定既防⽌其他的独占锁定,也防⽌其他的共享锁定。
下⾯介绍⼀下oracle的五种锁定: 1 ⾏共享锁定:⼀般通过select for update 语句隐式获得⾏共享锁定,在oracle中⽤户可以通过lock table in row share mode 语句显⽰获得⾏共享锁定。
⾏共享锁定并不防⽌对数据进⾏更改操作,但是防⽌其他会话获取独占性数据表锁定。
2 ⾏独占锁定:通过⼀条insert,update,delete语句隐式获取,或者通过⼀条lock table in row exclusive mode 语句显⽰获取。
这个锁定可以防⽌其他会话获取⼀个共享锁定,共享⾏独占锁定或者独占锁定。
3 表共享锁定:通过⼀条lock table in share mode 语句显⽰获得,这种锁定可以防⽌其他会话获取⾏独占锁定(insert,update,delete),或者防⽌其他表⾏独占锁定或者表独占锁定,他允许在表中拥有多个⾏共享和表共享锁定 4 表共享⾏独占:通过lock table in share row exclusive mode 语句显⽰获得,这种锁定可以防⽌其他会话获取⼀个表共享锁定,只是⼀次只能对⼀个表放置表共享⾏独占锁定 5 表独占:通过lock table in exclusive mode显⽰获得,这个苏定防⽌其他会话对该表的任何其他锁定。
Oracle的事务及锁

1、事务的概念:事务是一个基本的逻辑单元,它作为一个整体要么全部执行要么全部不执行。
2、事务的特性:原子性:事务是处理的一个原子单位,每一个操作不可拆分,它要么全部执行成功,要么全部都不执行。
一致性:指事务完成时,必须使所有的数据在整体上不变。
隔离性:各事务之间相互隔离,此事务的执行不受其他并发事务执行的干扰。
持续性:指事务对数据库的改变应是持续存在的,不会因故障而发生丢失。
3、从功能是上划分,sql语言分为DDL、DML和DCL:3.1DDL(Data Definition Language,数据定义语言):用于定义和管理数据库中的所有对象的语言,如:create创建表空间、alter修改表空间、drop 删除表空间3.2:DML(Data manipulation Language,数据操作语言):处理数据等操作,如:insert插入数据、delete删除数据、update修改数据、select查询数据3.3:DCL(Data Control Language,数据控制语言):授予或回收访问数据库的权限,控制数据库操作事务发生的时间及效果,对数据库实行监视,如:grant授权,rollback回滚,commit提交4、事务的开始及结束:一个事务可以由一条DDL语句单独组成或多条DML语句共同组成。
一个事务从执行第一条sql语句开始,在它被提交或被回滚时结束。
事务的提交可以是显式提交:用commit命令直接完成;也可以是提交隐式提交:用sql语句间接完成提交,这些语句有:alter,audit,comment,create,disconnect,drop,exit,grant,noaudit,quit,revoke,rename,会话终止等;还可以是自动提交:set autocommit on或set autocommit immediate设置为自动提交,则在插入、删除、修改语句执行后自动提交,使用set autocommit off可以取消自动提交,show autocommit可以查看自动提交是否打开。
oracle数据库中锁、序列、索引管理

详析Oracle数据库中锁、序列、索引管理一、锁1.1什么是锁数据库是一个多用户使用的共享资源。
当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。
若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。
而锁就是用于控制事务对数据的访问,实现事务的并发控制,保持数据库的一致性。
1.2锁的类型DDL锁:被Oracle自动的发布和释放DML锁:在事务处理的开始时被施加,而且在事务处理完成时被释放(使用Commit 或Rollback时被释放)内部锁:由Oracle自己管理以保护内部数据库结构注:DDL锁由数据库自动管理;DML锁和内部锁可以由用户直接或间接管理。
1.3锁的粒度1)TX锁:行级锁(事务锁),会阻止这行上其它DML操作,直到Commit或Rollback 时被释放,它只有X排他锁2)TM锁:表级锁。
2.1)Row-S 行共享(RS):共享行锁,即可被其他事务查询该行。
2.2)Row-X 行专用(RX):用于行的修改,即禁止其他事务对该行的所有操作。
2.3)Share 共享锁(S):阻止其他DML操作2.4)S/Row-X 共享行专用(SRX):阻止其他事务操作2.5)exclusive 专用(X):独立访问使用3)数据库级锁:锁定数据库为限制模式alter system enable restricted session;以下语句将锁定数据库为只读模式startup mount;alter database open read only;1.4锁的模式和使用1)共享锁(Share Table Lock,S):使用情况:当执行事务时,事务所要操作的表不希望被别的事务更新时可以使用。
即某表被加锁后只能被加锁的事务全权控制,其他事务只能对该表执行查询操作。
加锁语法:Lock Table TableName In Share Mode;使用度:中。
当对表执行大面积更新操作时可使用,反之,则不用。
Oracle中锁的产生和解锁

Oracle中锁的产品和解锁文档修改记录版本号日期说明编写者审核者V1.0 20110822 初稿周伟明1Oracle锁的介绍在多进程或者多线程业务系统中,多个Oracle用户可以同时登录到一个Oracle数据库,对数据库中的数据进行操作难免会出现同时访问同一数据(表或者表中某一条记录)的情况,如果不对这种情况进行规范操作,数据的一致性和完整性就得不到保证,从而会出现意想不到的结果,所以必须有一种机制对并发访问进行控制和调度,避免造成数据更新不正确。
Oracle锁就是这样一种机制,它是控制并发操作最常用的方法。
Oracle使用锁来防止进程相互之间发生的破坏性影响,当一个进程企图阻止另外一个进程对某条数据操作时,该进程就对这个数据进行锁,别的进程对这个数据操作之前,必须获得这个数据的解锁。
Oracle锁功能是Oracle DBMS自动完成的,不需要用户干预,但Oracle也提供了加锁的命令,供用户使用。
1.1 Oracle锁机制Oracle自动使用不同锁类型来控制数据的并发操作,以防止用户之间的破坏性干扰。
Oracle为一个事务自动锁一个资源,以防止其他事务对同一个资源的排他锁。
当某种条件出现或者事务不再需要该资源时,锁自动解除。
Oracle自动获取不同类型的锁取决于锁的资源及其所执行的操作。
其中包括数据锁(DML)、字典锁(DDL)、内部锁、人工锁定、分布锁和并行缓冲管理锁。
1.1.1数据锁(DML)模式数据锁保证表中数据在多个用户并发操作数据时保证数据的完整性,并防止相冲突的DML和DDL操作的破坏性干扰。
DML操作可在两个级别获取数据锁:行级锁(TX)和表级锁(TM)。
表级锁有以下几种方式●空Null,即无锁。
●行共享表锁(RS)行共享表锁(有时也叫SS),表明事务保持已锁表行的表锁,并试图修改数据。
这种锁是在执行以下命令的时自动获取:Select …From 表名… for update for …;Lock Table 表名 in Row Share Mode;当一个事务在一个表持有行共享锁的时候,允许其他事务并行查询、插入、修改或者删除及再进行行锁,但禁止其他事务以排他方式进行操作该表。
oracle的TM锁T锁知识完全普及

oracle的TM锁、TX锁知识完全普及锁概念基础数据库是一个多用户使用的共享资源;当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况;若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性;加锁是实现数据库并发控制的一个非常重要的技术;当事务在对某个数据对象进行操作前,先向系统发出请求,对其加锁;加锁后事务就对该数据对象有了一定的控制,在该事务释放锁之前,其他的事务不能对此数据对象进行更新操作;在数据库中有两种基本的锁类型:排它锁Exclusive Locks,即X锁和共享锁Share Locks,即S锁;当数据对象被加上排它锁时,其他的事务不能对它读取和修改;加了共享锁的数据对象可以被其他事务读取,但不能修改;数据库利用这两种基本的锁类型来对数据库的事务进行并发控制;Oracle数据库的锁类型根据保护的对象不同,Oracle数据库锁可以分为以下几大类:DML锁data locks,数据锁,用于保护数据的完整性;DDL锁dictionary locks,字典锁,用于保护数据库对象的结构,如表、索引等的结构定义;内部锁和闩internal locks and latches,保护数据库的内部结构;DML锁的目的在于保证并发情况下的数据完整性,;在Oracle数据库中,DML锁主要包括TM锁和TX锁,其中TM锁称为表级锁,TX锁称为事务锁或行级锁;当Oracle 执行DML语句时,系统自动在所要操作的表上申请TM类型的锁;当TM 锁获得后,系统再自动申请TX类型的锁,并将实际锁定的数据行的锁标志位进行置位;这样在事务加锁前检查TX锁相容性时就不用再逐行检查锁标志,而只需检查TM锁模式的相容性即可,大大提高了系统的效率;TM锁包括了SS、SX、S、X 等多种模式,在数据库中用0-6来表示;不同的SQL操作产生不同类型的TM锁;在数据行上只有X锁排他锁;在 Oracle数据库中,当一个事务首次发起一个DML 语句时就获得一个TX锁,该锁保持到事务被提交或回滚;当两个或多个会话在表的同一条记录上执行 DML语句时,第一个会话在该条记录上加锁,其他的会话处于等待状态;当第一个会话提交后,TX锁被释放,其他会话才可以加锁;当Oracle数据库发生TX锁等待时,如果不及时处理常常会引起Oracle数据库挂起,或导致死锁的发生,产生ORA-60的错误;这些现象都会对实际应用产生极大的危害,如长时间未响应,大量事务失败等;悲观封锁和乐观封锁一、悲观封锁锁在用户修改之前就发挥作用:Select ..for updatenowaitSelect from tab1 for update用户发出这条命令之后,oracle将会对返回集中的数据建立行级封锁,以防止其他用户的修改;如果此时其他用户对上面返回结果集的数据进行dml或ddl操作都会返回一个错误信息或发生阻塞;1:对返回结果集进行update或delete操作会发生阻塞;2:对该表进行ddl操作将会报:Ora-00054:resource busy and acquire with nowait specified.原因分析此时Oracle已经对返回的结果集上加了排它的行级锁,所有其他对这些数据进行的修改或删除操作都必须等待这个锁的释放,产生的外在现象就是其他的操作将发生阻塞,这个这个操作commit或rollback.同样这个查询的事务将会对该表加表级锁,不允许对该表的任何ddl操作,否则将会报出ora-00054错误::resource busy and acquire with nowait specified.二、乐观封锁乐观的认为数据在select出来到update进取并提交的这段时间数据不会被更改;这里面有一种潜在的危险就是由于被选出的结果集并没有被锁定,是存在一种可能被其他用户更改的可能;因此Oracle仍然建议是用悲观封锁,因为这样会更安全;阻塞定义:当一个会话保持另一个会话正在请求的资源上的锁定时,就会发生阻塞;被阻塞的会话将一直挂起,直到持有锁的会话放弃锁定的资源为止;4个常见的dml语句会产生阻塞INSERTUPDATEDELETESELECT…FOR U PDATEINSERTInsert发生阻塞的唯一情况就是用户拥有一个建有主键约束的表;当2个的会话同时试图向表中插入相同的数据时,其中的一个会话将被阻塞,直到另外一个会话提交或会滚;一个会话提交时,另一个会话将收到主键重复的错误;回滚时,被阻塞的会话将继续执行;UPDATE 和DELETE当执行Update和delete操作的数据行已经被另外的会话锁定时,将会发生阻塞,直到另一个会话提交或会滚;Select …for update当一个用户发出select..for update的错作准备对返回的结果集进行修改时,如果结果集已经被另一个会话锁定,就是发生阻塞;需要等另一个会话结束之后才可继续执行;可以通过发出select… for update nowait的语句来避免发生阻塞,如果资源已经被另一个会话锁定,则会返回以下错误:Ora-00054:resource busy and acquire with nowait specified.死锁-deadlock定义:当两个用户希望持有对方的资源时就会发生死锁.即两个用户互相等待对方释放资源时,oracle认定为产生了死锁,在这种情况下,将以牺牲一个用户作为代价,另一个用户继续执行,牺牲的用户的事务将回滚.例子:1:用户1对A表进行Update,没有提交;2:用户2对B表进行Update,没有提交;此时双反不存在资源共享的问题;3:如果用户2此时对A表作update,则会发生阻塞,需要等到用户一的事物结束;4:如果此时用户1又对B表作update,则产生死锁;此时Oracle会选择其中一个用户进行会滚,使另一个用户继续执行操作;起因:Oracle的死锁问题实际上很少见,如果发生,基本上都是不正确的程序设计造成的,经过调整后,基本上都会避免死锁的发生;DML锁分类表1.关于V$lock表和相关视图的说明Lock mode in which the session holds the lock:0 - none1 - null NULL2 - row-S SS3 - row-X SX4 - share S5 - S/Row-X SSX6 - exclusive X--大于0时表示当前会话以某种模式占有该锁,等于0时表示当前会话正在等待该锁资源,即表示该会话被阻塞;--往往在发生TX锁时,伴随着TM锁,比如一个sid=9会话拥有一个TM锁,一般会拥有一个或几个TX锁,但他们的id1和id2是不同的,请注意Lock mode in which the process requests the lock:0 - none1 - null NULL2 - row-S SS3 - row-X SX4 - share S5 - S/Row-X SSX6 - exclusive X--大于0时,表示当前会话被阻塞,其它会话占有改锁的模式2.其它相关视图说明select from v$lock;select from v$lock where block=1;2.查询被锁的对象select from v$locked_object;3.查询阻塞查被阻塞的会话select from v$lock where lmode=0 and type in 'TM','TX';查阻塞别的会话锁select from v$lock where lmode>0 and type in 'TM','TX';4.查询数据库正在等待锁的进程select from v$session where lockwait is not null;5.查询会话之间锁等待的关系select holdsid, waitsid,,,, from v$lock a,v$lock bwhere = and = and =1and =0;6.查询锁等待事件select from v$session_wait where event='enqueue';。
ORACLE锁

ORACLE锁开发多用户、数据库驱动的应用时,最大的难点之一:一方面要力争取得最大限度的并发访问,与此同时还要确保每个用户能以一致的方式读取和修改数据;为此就有了锁定(locking)机制。
锁(lock)机制用于管理对共享资源的并发访问,同时还能提供数据完整性和一致性。
有多少种数据库,其中就可能有多少种实现锁定的方法。
时刻记住以下两点:1、所有数据库本质上都不同。
2、为一个新的数据库平台设计应用时,对于数据库如何工作不能做任何假设。
如SQL Server利用聚簇索引,就能按聚簇键的顺序在整个表中插入行(而不是只在表的末尾插入),以改善SQL Server数据库的并发性。
而且默认情况下,SQL Server每执行一条语句后就会立即提交或回滚。
这样为了得到更大的并发性,但是会破坏事务完整性。
在Oracle中事务是每个数据库的核心在必要时才提交,不要太快提交,以避免对系统带来压力。
事务的大小只应该根据业务逻辑来定。
只要需要,就应该尽可能长时间地保持对数据所加的锁。
行级锁没有相关的开销,根本没有。
不论你是有1个行锁,还是1000000个行锁,专用于锁定这个信息的“资源”数都是一样的。
不同级别的锁的开销是一样的数据读取器不会被数据写入器阻塞。
数据写入器也不会被数据读取器阻塞。
一、锁定问题:丢失更新;需要使用某种锁定策略,共有两种锁定策略:悲观锁定或乐观锁定。
1、悲观锁定;在试图更新之前我们就把行锁住了。
2、乐观锁定;锁定都延迟到即将执行更新之前才做。
执行更新的失败可能性会加大。
实现方法有很多,以下介绍四种:a、在应用中同时保留旧值和新值,存储行的所有“前”(before)映像。
b、使用版本列的乐观锁定;版本维护:应用、存储、触发器(开销较大)。
c、使用校验和的乐观锁定;计算散列或校验和有很多方法。
计算散列或校验和是一个CPU密集型操作,相当占用CPU。
如果从网络开销角度看,计算散列或校验和只需在网络上传输相当小的散列值,而不是行的完整的前映像和后映像。
Oracle管理之锁

3、数据并发
SQL> lock table emp in exclusive mode; Table(s) Locked. 这条语句表示,任何试图更新锁表中的行的任何其他事务都必须等待发出锁定请求的事务完成。有以下锁模式: 1. ROW SHARE:允许同时访问锁定的表,但禁止会话将整个表锁定为独占访问。 2. ROW EXCLUSIVE:与ROW SHARE相同,但同时禁止锁定为SHARE模式,当更新、插入或删除数据时,
ORA-03135: connection lost contact
10、使用SQL解决锁冲突
• V$SESSION表包含所有连接会话的详细信息。blocking_session是阻断会话的会话ID。使用SID 和SERIAL#终止会话。
• 例子:查询锁并终止会话
11、死锁
• 死锁是锁冲突的一个特殊例子。互相等待对方完成事务。 • Oracle数据库自动检测死锁并终止错误的语句。对该错误的正确响应是提交或回滚,将释放该会
• 在这种情况下DBA必须检测和解决冲突。
7、锁冲突的可能原因
锁冲突最常见的原因是未提交更改,但也有一些其他可能的原因: 1. 长时间运行的事务:许多应用程序使用批处理来执行批量更新。这些批处理作业通常是在非业务
时间执行,但在某些情况下,他们可能没有完成或可能需要太长时间运行。当事务和批处理同时 执行时,会经常出现锁冲突。 2. 不必要的高锁定级别:不是所有的数据库都支持行级锁。某些数据库仍只能在页或表级锁定。开 发者编写运行在许多不同的数据库的应用程序的时候,经常人为的高级别锁定,就使得Oracle数 据库的行为类似于其他只能表级锁定的数据库系统。
深入浅出oracle锁

深入浅出oracle锁---原理篇深入浅出oracle锁---锁阻塞的分析深入浅出oracle锁---原理篇在现代的多用户多任务系统中,必然会出现多个用户同时访问共享的某个对象,这个对象可能是表,行,或者内存结构,为了解决多个用户并发性访问带来的数据的安全性,完整性及一致性问题,必须要有一种机制,来使对这些共享资源的并发性访问串行化,oracle中的锁就可以提供这样的功能,当事务在对某个对象进行操作前,先向系统发出请求,对其加相应的锁,加锁后该事务就对该数据对象有了一定的控制权限,在该事务释放锁之前,其他的事务不能对此数据对象进行更新操作(可以做select动作,但select利用的是undo中的前镜像数据了).Oracle锁的分类Oracle锁基本上可以分为二类a:共享锁(sharelocks)也称读锁,s锁b:排它锁(exclusivelocks)也称写锁,x锁在数据库中有两种基本的锁类型:排它锁(ExclusiveLocks,即X锁)和共享锁(ShareLocks,即S锁)。
当数据对象被加上排它锁时,其他的事务不能对它读取和修改。
加了共享锁的数据对象可以被其他事务读取,但不能修改。
数据库利用这两种基本的锁类型来对数据库的事务进行并发控制。
按锁保护的内容分类oracle提供多粒度封锁机制,按保护对象来分,据此又可以分为a:dml锁,data locks数据锁,用来保护数据的完整性和一致性b:ddl锁,dictionarylocks字典锁,用来保护数据对象的结构,如table,index的定义c:内部锁和闩internallocksandlatchs用来保护数据库内部结构,如sga内存结构dml锁DML锁主要包括TM锁和TX锁,其中TM锁称为表级锁,TM锁的种类有S,X,SR,SX,SRX五种,TX锁称为事务锁或行级锁。
当Oracle执行delete,update,insert,selectforupdateDML语句时,oracle首先自动在所要操作的表上申请TM类型的锁。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Oracle数据库中的锁机制
锁机制是数据库管理系统用来保证数据一致性和隔离性的重要手段。
在Oracle数据库中,锁机制也起到了至关重要的作用。
本文将介绍Oracle数据库中的锁机制,包括锁分类、锁级别、锁粒度及其应用。
一、锁分类
在Oracle数据库中常用的锁分类有两类,分别是悲观锁和乐观锁。
悲观锁指的是当一个事务操作时,它会认为其他事务会对自己操作的
数据造成影响,因此会对该数据加锁;乐观锁则是认为其他事务不会
对自己操作的数据造成影响,只有在进行提交时才检测是否有其他事
务对数据进行了修改。
二、锁级别
在Oracle数据库中,锁级别分为行级锁和表级锁两种,行级锁是对
一行数据进行加锁,而表级锁则是对整个表进行加锁。
行级锁对于并
发操作较高的情况更为适用,因为行级锁只会锁定部分数据而不是整
个表,而表级锁则会对整个表进行锁定,会对系统性能造成较大的影响。
三、锁粒度
在Oracle数据库中,锁粒度可以分为悲观锁和乐观锁两类。
悲观锁
的锁粒度一般较小,通常会锁定某一行或某一块数据;乐观锁的锁粒
度一般较大,通常是以版本号为依据,对整个表或整个数据区进行锁定。
四、应用
在应用中,Oracle数据库的锁机制一般会用于实现数据库的并发控制和数据隔离。
在并发控制方面,锁机制可以防止多个事务同时对同一资源进行操作,从而保证数据的一致性;在数据隔离方面,锁机制可以避免由于多个事务对同一数据进行操作而造成的数据冲突。
总之,Oracle数据库中的锁机制是数据库管理系统中很重要的一部分。
了解Oracle锁机制的分类、级别和粒度,可以在数据隔离、并发控制、性能优化等领域中得到应用。
因此,数据库管理员和开发人员需要对锁机制有深入的了解,以便在应用开发和数据库管理中做出更好的决策。