oracle锁原理

合集下载

oracle加锁方式,oracle中加锁与解锁

oracle加锁方式,oracle中加锁与解锁

oracle加锁⽅式,oracle中加锁与解锁oracle中的数据在并发操作时,为了防⽌错误的发⽣可以进⾏记录或者数据库表的加锁操作。

当锁操作完成时可以进⾏解锁操作。

数据库中加锁有两种⽅式,独占模式和共享模式。

1.独占模式,不允许其他会话以任何⽅式共享锁定资源,当进⾏数据库数据修改时可以使⽤这种模式。

2.共享模式,允许在数据访问时,并发共同访问,但是当修改数据时上升为独占模式。

锁分为⾏级锁和表级锁,⾏级锁是锁定某些⾏记录,表级锁是锁定整张表。

1.⾏级锁。

insert update delete (隐式加⾏锁) select...for update(显⽰加⾏锁,共享模式) select * from emp where deptno=30 for update select * from A where id=2 for update skip locked update emp set ename='Joke' where empno=7499;在释放锁之前其他⽤户只能对进⾏数据查询,不能对数据进⾏insert、delete和update。

假如有其他⽤户要锁定同⼀资源:可以使⽤wait ⼦句对锁的等待时间控制如:在另⼀⽤户中:select * from emp where deptno=30 for update wait 2 (等待2秒如2秒钟还未释放资源,系统将会给出提⽰信息。

2.表级锁。

共享模式(in share mode) 共享更新模式(in share update mode) 排他锁模式锁定表的通⽤语法: lock table 表名 in ;1) 共享模式 不允许其他⽤户插⼊,更新和删除⾏,多个⽤户可以同时在同⼀表上设置共享锁,这样设置锁的多个⽤户都只能执⾏查询 lock table emp in share mode;2)共享更新模式(in share update mode) 允许多个⽤户同时锁定表的不同⾏, 允许其他⽤户进⾏DML(insert update delete select)操作 , 除了已锁定的⾏ 如: lock table emp in share update mode; select * from emp where deptno=30 for update //锁定的⾏其他⽤户不能delete ,update 部门30的雇员信息 其他⽤户可以查看锁定的⾏: select * from emp where deptno=303)排他锁模式(限制性强) 不允许其他⽤户插⼊,更新和删除⾏, 允许查看数据,但只有⼀个⽤户可以在表中放置排他锁 lock table emp in exclusive mode;解锁:(1)锁表查询的代码有以下的形式: select count(*) from v$locked_object; select * from v$locked_object;(2)查看哪个表被锁 select b.owner,b.object_name,a.session_id,a.locked_mode from v$locked_object a,dba_objects b where b.object_id = a.object_id; (3)查看是哪个session引起的 select ername,b.sid,b.serial#,logon_time from v$locked_object a,v$session b where a.session_id = b.sid order by b.logon_time;(4)杀掉对应进程 执⾏命令:alter system kill session'1025,41'; 其中1025为sid,41为serial#.。

Oracle的事务及锁

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死锁问题,及产生的原因

解决Oracle死锁问题,及产⽣的原因
⽂章来源:
最近⽼是发现应该执⾏操作数据库的代码时发现执⾏不了,查了⼀下发现是数据库表锁死的原因,
,纠其原因,发现有些同事操作数据库时⽼是喜欢⽤select * from XXX for update
去操作数据库,有的操作了⼜没有COMMIT 所以导致数据库锁死,笔都建议⼤家不⽤,如果要⽤for update 之后请你记得提交解决死锁的⽅法
第⼀步:找到数据库中被锁死的表
select object_id,session_id,locked_mode from v$locked_object;
第⼆步:找到表的SID SERIAL#
select ername,t2.sid,t2.serial#,t2.logon_time
from v locked o bjectt1,v session t2
where t1.session_id=t2.sid order by t2.logon_time;
第三步:强杀锁死的表
alter system kill session 'sid,serial#';
另:Oracle9I以后的版本有⾃动处理锁死表的能⼒!
Processing math: 100%。

Oracle用户被锁的原因及解决办法

Oracle用户被锁的原因及解决办法

Oracle⽤户被锁的原因及解决办法在登陆时被告知test⽤户被锁1、⽤dba⾓⾊的⽤户登陆,进⾏解锁,先设置具体时间格式,以便查看具体时间SQL> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';Session altered.2、查看具体的被锁时间SQL> select username,lock_date from dba_users where username='TEST';USERNAME LOCK_DATETEST 2009-03-10 08:51:033、解锁SQL> alter user test account unlock;User altered.4、查看是那个ip造成的test⽤户被锁查看$ORACLE_HOME/network/admin/log/listener.log⽇志10-MAR-2009 08:51:03 * (CONNECT_DATA=(SID=lhoms)(SERVER=DEDICATED)(CID=(PROGRAM=Oracle)(HOST=omstestdb)(USER=oraoms))) * (ADDRESS=(PROTOCOL=tcp)(HOST=10.69.1.11)(PORT=49434)) * establish * lhoms * 0 10-MAR-2009 08:51:03 * (CONNECT_DATA=(SID=lhoms)(SERVER=DEDICATED)(CID=(PROGRAM=oracle)(HOST=omstestdb)(USER=oraoms))) * (ADDRESS=(PROTOCOL=tcp)(HOST=10.69.1.11)(PORT=49435)) * establish * lhoms * 0这样可知是上⾯10.69.1.11的ip尝试多次失败登陆造成的被锁注:⼀般数据库默认是10次尝试失败后锁住⽤户1、查看FAILED_LOGIN_ATTEMPTS的值select * from dba_profiles2、修改为30次alter profile default limit FAILED_LOGIN_ATTEMPTS 30;3、修改为⽆限次(为安全起见,不建议使⽤)alter profile default limit FAILED_LOGIN_ATTEMPTS unlimited;以上所述是⼩编给⼤家介绍的Oracle⽤户被锁的原因及解决办法,希望对⼤家有所帮助,如果⼤家有任何疑问请给我留⾔,⼩编会及时回复⼤家的。

oracle锁原理

oracle锁原理

Oracle锁原理详解1. 概述在Oracle数据库中,锁是用于控制并发访问的一种机制。

当多个用户同时访问数据库时,为了保证数据的一致性和完整性,Oracle会对数据进行加锁,以防止其他用户对数据的修改。

本文将详细介绍Oracle锁的基本原理。

2. 锁的类型Oracle中的锁可以分为两种类型:共享锁(Shared Lock)和排他锁(Exclusive Lock)。

•共享锁:多个事务可以同时获取共享锁,并且可以并发读取数据,但不能修改数据。

共享锁用于保证数据的一致性,即多个事务可以同时读取相同的数据,但不能同时修改数据。

•排他锁:只有一个事务可以获取排他锁,并且其他事务不能同时获取共享锁或排他锁。

排他锁用于保证数据的完整性,即一个事务在修改数据时,其他事务不能同时读取或修改数据。

3. 锁的级别Oracle中的锁可以分为多个级别,包括表级锁、行级锁和字段级锁。

•表级锁:锁定整个表,阻止其他事务对表的修改。

表级锁对于大型表来说,可能会导致性能问题,因为它会阻塞其他事务的访问。

•行级锁:锁定表中的一行数据,其他事务可以并发读取其他行的数据。

行级锁可以更细粒度地控制并发访问,但可能会导致死锁问题。

•字段级锁:锁定表中的一个或多个字段,其他事务可以并发读取或修改其他字段的数据。

字段级锁可以进一步细化锁的粒度,但也可能导致死锁问题。

4. 锁的控制Oracle中的锁由数据库管理系统(DBMS)自动控制,用户无需手动操作。

当一个事务对数据进行修改时,DBMS会自动为该数据加上相应的锁,并在事务提交或回滚后释放锁。

锁的控制是通过锁定机制和并发控制机制实现的。

•锁定机制:当一个事务对数据进行修改时,DBMS会自动为该数据加上相应的锁。

锁定机制可以保证在并发访问时,每个事务都能正确地读取和修改数据。

•并发控制机制:当多个事务同时访问数据库时,DBMS会根据事务的隔离级别来控制并发访问。

并发控制机制可以避免脏读、不可重复读和幻读等问题。

oracle行锁加锁规则

oracle行锁加锁规则

oracle行锁加锁规则Oracle行锁加锁规则行锁是Oracle数据库中一种重要的锁机制,用于保证并发事务的数据一致性和完整性。

行锁的加锁规则对于数据库的性能和并发控制至关重要。

本文将介绍Oracle行锁的加锁规则。

1. 什么是行锁行锁是指对数据库表中的某一行数据进行锁定,使其他事务无法修改该行数据,从而保证数据的一致性和完整性。

行锁是一种细粒度的锁,可以在并发环境中提供更好的性能和并发控制。

2. 行锁的加锁规则(1)行锁是基于事务的,只有在事务中才能加锁和释放锁。

(2)行锁是自动加锁的,当事务对某一行数据进行修改时,会自动加上行锁。

(3)行锁的粒度是行级别的,只锁定被修改的行,而不是整个表或数据块。

(4)行锁的加锁和释放是自动的,无需手动操作。

(5)行锁是互斥的,即同一行数据只能被一个事务加锁,其他事务必须等待锁释放后才能进行修改操作。

(6)行锁的持有时间应尽量缩短,避免长时间占用锁资源,影响其他事务的执行效率。

(7)行锁的粒度应尽量细化,避免锁住不必要的行,提高并发性能。

3. 行锁的优化策略(1)尽量减少事务的锁持有时间,及时释放锁资源。

(2)尽量使用最小粒度的锁,只锁定必要的行,避免锁住不必要的行。

(3)合理设计事务的执行顺序,避免死锁的发生。

(4)使用合适的并发控制机制,如乐观锁和悲观锁的结合使用,提高并发性能。

(5)合理设置数据库的参数,如并发连接数和锁超时时间,以提高并发性能。

总结行锁是Oracle数据库中重要的并发控制机制,它通过对数据表中的某一行数据进行锁定,保证事务的一致性和完整性。

行锁的加锁规则需要遵循事务的原子性和隔离性,同时要合理设计锁的粒度和持有时间,以提高数据库的性能和并发控制能力。

在实际应用中,我们需要根据具体的业务需求和并发访问情况,进行合理的行锁优化策略,以提高系统的性能和稳定性。

oracle锁表原因和如何解锁分享

oracle锁表原因和如何解锁分享

oracle锁表原因和如何解锁分享最近项⽬项⽬开始忙起来了,就不哔哔了,直接给你们看东西好了。

查锁表select a.OS_USER_NAME, c.owner, c.object_name, b.sid, b.serial#, logon_timefrom v$locked_object a, v$session b, dba_objects cwhere a.session_id = b.sidand a.object_id = c.object_idorder by b.logon_time;解锁ALTER SYSTEM KILL SESSION '129,77';查什么系统导致上的锁select spid, osuser, s.programfrom v$session s,v$process pwhere s.paddr=p.addr and s.sid=129查看什么语句导致锁表的select l.session_id sid,s.serial#,l.locked_mode,l.oracle_username,er#,l.os_user_name,s.machine,s.terminal,a.sql_text,a.actionfrom v$sqlarea a, v$session s, v$locked_object lwhere l.session_id = s.sidand s.prev_sql_addr = a.addressorder by sid, s.serial#;查看有⼏个表被锁select count(*) from v$locked_object;查表SPID129是通过查锁表查出来的SIDselect spid, oSUSEr, s.programfrom v$session s,v$process pwhere s.paddr=p.addr and s.sid=129当Kill不能解锁时,Ctrl+R CMD 输⼊下⾯这句,结束线程。

Oracle包被锁定的原因分析及解决方案

Oracle包被锁定的原因分析及解决方案

Oracle包被锁定的原因分析及解决方案在数据库的开发过程中,经常碰到包、存储过程、函数无法编译或编译时会导致PL/SQL 无法响应的问题。

碰到这种问题,基本上都要重启数据库解决,严重浪费开发时间。

本文将就产生这种现象的原因和解决方案做基本的介绍。

问题分析从事数据库开发的都知道锁的概念,如:执行Update Table xxx Where xxx 的时候就会产生锁。

这种常见的锁在Oracle 里面被称为DML锁。

在Oracle中还有一种DDL锁,主要用来保证存储过程、表结构、视图、包等数据库对象的完整性,这种锁的信息可以在DBA_DDL_LOCKS中查到。

注意:V$LOCKED_OBJECT记录的是DML锁信息,DDL锁的信息不在里面。

对应DDL锁的是DDL语句,DDL语句全称数据定义语句(Data Define Language)。

用于定义数据的结构或Schema,如:CREATE、ALTER、DROP、TRUNCATE、COMMENT、RENAME。

当我们在执行某个存储过程、或者编译它的时候Oracle会自动给这个对象加上DDL锁,同时也会对这个存储过程所引用的对象加锁。

了解了以上知识以后,我们可以得出结论:编译包长时间无响应说明产生了死锁。

我们可以轻易的让这种死锁发生,举例:1、打开一个PL/SQL,开始调试某个函数(假设为:FUN_CORE_SERVICECALL),并保持在调试状态2、打开一个SQL Window,输入Select *Fromdba_ddl_locks aWhere ='FUN_CORE_SERVICECALL'会发现一行记录:3、打开一个新的PL/SQL,重新编译这个函数。

我们会发现此时已经无法响应了4、回到第一个PL/SQL ,重新执行Select *Fromdba_ddl_locks aWhere ='FUN_CORE_SERVICECALL'我们将会看到如下记录:5、上述的情况表明发生了锁等待的情况。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

oracle锁原理
Oracle数据库系统是当今最为流行和广泛使用的关系型数据库
管理系统之一。

在Oracle中,锁是实现并发控制的重要机制之一。

本文将探讨Oracle锁的原理,包括锁的种类、分级和适用场景等。

一、概述
在多用户并发访问的数据库环境中,锁的作用是确保数据的完
整性和一致性。

Oracle中的锁可以分为共享锁(Shared Lock)和
排他锁(Exclusive Lock)两种类型。

1. 共享锁(Shared Lock)
共享锁允许多个事务同时读取同一个数据对象,但不允许对该
数据对象进行修改。

当一个事务获取了共享锁后,其他事务只能
再获取共享锁,而不能获取排他锁。

共享锁之间是兼容的,可以
共存。

2. 排他锁(Exclusive Lock)
排他锁是最严格的锁类型,它在事务需要修改数据对象时才会
被获取。

当一个事务获取了排他锁后,其他事务无法同时获取共
享锁或排他锁,保证了数据对象的独占性。

二、锁的级别
Oracle中的锁按照锁住范围的不同可以分为表级锁(Table Lock)和行级锁(Row Lock)两种级别。

1. 表级锁(Table Lock)
表级锁是对整个表进行加锁,当一个事务对某个表加锁时,其他事务无法修改该表中的任何数据。

表级锁的粒度大,锁的冲突较多,对并发性能有一定的影响,因此在实际应用中尽量避免使用表级锁。

2. 行级锁(Row Lock)
行级锁是对表中的每一行进行加锁,当一个事务对某一行加锁时,其他事务可以同时对其他行进行修改。

行级锁的粒度小,锁的粒度细,可以提高并发性能。

Oracle通过使用多版本并发控制(Multi-Version Concurrency Control,MVCC)来实现行级锁。

三、锁的控制策略
Oracle通过以下几种控制策略来管理锁:
1. 乐观并发控制(Optimistic Concurrency Control,OCC)
乐观并发控制假设并发事务之间的冲突较少,因此允许事务在
修改数据时不获取锁,而是在提交时检测是否有冲突发生。

如果
发生了冲突,则需要回滚事务并重试。

2. 悲观并发控制(Pessimistic Concurrency Control,PCC)
悲观并发控制假设并发事务之间的冲突较多,因此在事务开始
时就获取所需的锁。

这种控制策略可以保证数据的一致性,但会
降低并发性能。

3. 死锁检测和解除
Oracle数据库会自动检测并解除死锁。

当发生死锁时,Oracle
会选择其中一个事务进行回滚,解除死锁并让其他事务继续执行。

四、锁的应用场景
锁的应用场景包括并发访问的读写操作和数据一致性的维护。

1. 并发读写操作
在多个事务并发读写同一个数据对象时,需要使用共享锁和排他锁来保证数据的一致性和并发性。

2. 数据一致性维护
当需要对数据库进行大规模的修改操作时,可以加表级锁来控制对整个表的访问,以保证数据的完整性。

总结
Oracle作为一个强大的关系型数据库管理系统,锁机制是控制并发访问的重要手段之一。

本文讨论了Oracle锁的种类、级别和控制策略,并介绍了锁的应用场景。

合理使用锁可以提高数据库的并发性能,保证数据的一致性和完整性。

相关文档
最新文档