在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 存储过程并发写法在Oracle数据库中,并发是指多个用户或进程同时访问数据库的能力。
在并发环境下,存储过程的设计和实现需要考虑到并发性,以确保数据的一致性和安全性。
下面是一些常见的Oracle存储过程并发写法。
1.悲观并发控制(Pessimistic Concurrency Control)悲观并发控制是指在操作数据之前,事先假设其他用户或进程会对相同的数据进行修改,因此需要采取锁机制来保护数据。
在Oracle 中,可以使用行级锁来实现悲观并发控制。
在存储过程中,可以使用以下方法实现悲观并发控制:-使用SELECT ... FOR UPDATE语句,在读取数据时对数据进行加锁,防止其他用户并发修改。
-使用LOCK TABLE语句,对需要修改的表进行锁定,防止其他用户并发访问。
-使用排他锁(exclusive lock),只允许一个用户修改数据,其他用户需要等待锁释放。
悲观并发控制的缺点是会对性能产生一定的影响,因为需要等待锁的释放。
此外,如果锁的粒度过大,也会导致并发性下降。
2.乐观并发控制(Optimistic Concurrency Control)乐观并发控制是指在操作数据之前,并不主动加锁,而是在提交事务时检查数据是否被其他用户修改过。
在Oracle中,可以通过使用版本号或时间戳来实现乐观并发控制。
在存储过程中,可以使用以下方法实现乐观并发控制:-在表中添加一个版本号或时间戳字段,并在读取和更新数据时进行比较和更新。
-使用MERGE语句,在更新数据时同时检查数据是否被其他事务修改过。
乐观并发控制的优点是不需要加锁,对性能影响较小。
但是如果多个用户并发修改同一行数据,则可能发生冲突,需要进行冲突处理。
3.分段锁(Partition Locking)分段锁是指将数据分成多个段,并对每个段进行锁定,以实现高并发。
在Oracle中,可以通过使用分区(Partitioning)来实现分段锁。
oracle必问的面试题

oracle必问的面试题在面试过程中,许多公司都倾向于针对Oracle数据库进行提问。
作为一种常见的数据库管理系统,Oracle在企业级应用中扮演着重要的角色。
因此,掌握Oracle的相关知识对于求职者来说非常必要。
本文将介绍一些必问的Oracle面试题,帮助读者准备面试。
1. 什么是Oracle数据库?Oracle是一种关系型数据库管理系统(RDBMS),由Oracle公司开发。
它通过使用结构化查询语言(SQL)进行数据管理和查询。
Oracle数据库广泛应用于企业级应用,包括金融、制造、电信等领域。
2. 介绍一下Oracle数据库的体系结构。
Oracle数据库的体系结构由多个组件组成,包括实例、数据库和存储。
实例是内存结构和后台进程的组合,用于管理数据库。
数据库是存储数据的物理文件集合。
存储是用于存储和检索数据的物理设备,如硬盘。
3. 什么是表空间和数据文件?表空间是Oracle数据库中逻辑存储单位,用于存储表、索引和其他对象。
每个表空间由一个或多个数据文件组成。
数据文件是物理文件,用于在磁盘上存储数据。
4. 如何创建用户和授权?使用CREATE USER语句可以创建用户,语法如下:CREATE USER username IDENTIFIED BY password;要授予用户权限,可以使用GRANT语句,语法如下:GRANT privilege1, privilege2, ... ON object_name TO username;5. 介绍一下Oracle的锁机制。
Oracle使用各种锁来实现并发控制。
共享锁(Shared Lock)用于读取数据,排他锁(Exclusive Lock)用于修改数据。
Oracle还支持行级锁和表级锁,以及乐观锁和悲观锁等不同类型的锁机制。
6. 如何备份和恢复Oracle数据库?可以使用Oracle提供的工具来备份和恢复数据库,例如使用RMAN(Recovery Manager)进行备份和恢复操作。
oracle行锁加锁规则

oracle行锁加锁规则Oracle行锁加锁规则行锁是Oracle数据库中一种重要的锁机制,用于保证并发事务的数据一致性和完整性。
行锁的加锁规则对于数据库的性能和并发控制至关重要。
本文将介绍Oracle行锁的加锁规则。
1. 什么是行锁行锁是指对数据库表中的某一行数据进行锁定,使其他事务无法修改该行数据,从而保证数据的一致性和完整性。
行锁是一种细粒度的锁,可以在并发环境中提供更好的性能和并发控制。
2. 行锁的加锁规则(1)行锁是基于事务的,只有在事务中才能加锁和释放锁。
(2)行锁是自动加锁的,当事务对某一行数据进行修改时,会自动加上行锁。
(3)行锁的粒度是行级别的,只锁定被修改的行,而不是整个表或数据块。
(4)行锁的加锁和释放是自动的,无需手动操作。
(5)行锁是互斥的,即同一行数据只能被一个事务加锁,其他事务必须等待锁释放后才能进行修改操作。
(6)行锁的持有时间应尽量缩短,避免长时间占用锁资源,影响其他事务的执行效率。
(7)行锁的粒度应尽量细化,避免锁住不必要的行,提高并发性能。
3. 行锁的优化策略(1)尽量减少事务的锁持有时间,及时释放锁资源。
(2)尽量使用最小粒度的锁,只锁定必要的行,避免锁住不必要的行。
(3)合理设计事务的执行顺序,避免死锁的发生。
(4)使用合适的并发控制机制,如乐观锁和悲观锁的结合使用,提高并发性能。
(5)合理设置数据库的参数,如并发连接数和锁超时时间,以提高并发性能。
总结行锁是Oracle数据库中重要的并发控制机制,它通过对数据表中的某一行数据进行锁定,保证事务的一致性和完整性。
行锁的加锁规则需要遵循事务的原子性和隔离性,同时要合理设计锁的粒度和持有时间,以提高数据库的性能和并发控制能力。
在实际应用中,我们需要根据具体的业务需求和并发访问情况,进行合理的行锁优化策略,以提高系统的性能和稳定性。
oracle 数据库事务实现原理

oracle 数据库事务实现原理
Oracle数据库事务实现的原理涉及到数据库管理系统的核心功
能和ACID特性。
事务是一系列数据库操作的逻辑单元,要么全部执
行成功,要么全部失败回滚。
Oracle数据库通过以下几个方面来实
现事务的原理:
1. 日志记录,当事务开始时,Oracle会将事务的操作记录在
日志文件中,包括对数据的修改、插入和删除操作。
这样即使数据
库发生故障,也可以通过日志文件来恢复事务的一致性。
2. 事务隔离级别,Oracle数据库支持多种事务隔离级别,如
读未提交、读已提交、可重复读和串行化。
这些隔离级别可以确保
并发事务之间的数据一致性和隔离性。
3. 锁机制,Oracle数据库使用锁来控制事务对数据的访问,
包括共享锁和排他锁。
这样可以防止多个事务同时对同一数据进行
修改,保证数据的一致性和完整性。
4. 回滚段,Oracle数据库使用回滚段来存储事务的修改操作,如果事务失败或回滚,可以通过回滚段来还原数据的状态。
5. 事务日志,Oracle数据库会记录事务的提交和回滚操作,保证事务的持久性和原子性。
这样即使数据库发生故障,也可以通过事务日志来恢复数据的一致性。
总的来说,Oracle数据库通过日志记录、事务隔离级别、锁机制、回滚段和事务日志等多种机制来实现事务的原理,确保数据的一致性、隔离性、持久性和原子性,从而保证数据库操作的安全性和可靠性。
oracle数据库面试题目(3篇)

第1篇1. 请简述Oracle数据库的体系结构,并说明各层的作用。
2. 请解释什么是Oracle实例?实例与数据库之间的关系是什么?3. 请简述Oracle数据库的存储结构,包括数据文件、控制文件、日志文件等。
4. 请说明Oracle数据库的内存结构,包括SGA、PGA等。
5. 请解释Oracle数据库的备份策略,包括全备份、增量备份、差异备份等。
6. 请说明Oracle数据库的恢复策略,包括不完全恢复、完全恢复等。
7. 请解释Oracle数据库的事务管理,包括事务的ACID特性。
8. 请说明Oracle数据库的锁机制,包括共享锁、排他锁等。
9. 请解释Oracle数据库的并发控制,包括多版本并发控制(MVCC)。
10. 请说明Oracle数据库的安全机制,包括角色、权限、用户等。
二、SQL语言1. 请简述SQL语言的组成,包括数据定义语言(DDL)、数据操纵语言(DML)、数据控制语言(DCL)等。
2. 请说明如何创建一个简单的表,包括表结构、字段类型、约束等。
3. 请编写一个查询语句,查询某个表中所有年龄大于30岁的记录。
4. 请编写一个更新语句,将某个表中年龄大于40岁的记录的年龄加1。
5. 请编写一个删除语句,删除某个表中年龄小于20岁的记录。
6. 请编写一个插入语句,插入一条记录到某个表中。
7. 请说明如何使用SQL语句实现分页查询。
8. 请说明如何使用SQL语句实现多表查询。
9. 请说明如何使用SQL语句实现子查询。
10. 请说明如何使用SQL语句实现联合查询。
三、Oracle高级特性1. 请解释什么是视图?如何创建视图?2. 请解释什么是索引?有哪些常见的索引类型?3. 请解释什么是触发器?如何创建触发器?4. 请解释什么是存储过程?如何创建存储过程?5. 请解释什么是函数?如何创建函数?6. 请解释什么是包?如何创建包?7. 请解释什么是序列?如何创建序列?8. 请解释什么是同义词?如何创建同义词?9. 请解释什么是物化视图?如何创建物化视图?10. 请解释什么是分区表?如何创建分区表?四、Oracle性能优化1. 请说明如何查看Oracle数据库的性能统计信息。
Oracle之DBMS_LOCK包用法详解
Oracle之DBMS_LOCK包⽤法详解概述与背景某些并发程序,在⾼并发的情况下,必须控制好并发请求的运⾏时间和次序,来保证处理数据的正确性和完整性。
对于并发请求的并发控制,EBS系统可以通过Concurrent Program定义界⾯的Incompatibilities功能配置实现。
但是Incompatibilities功能存在其局限性,它只能把整个并发请求作为⼀个整体来判断,并不能细化到并发请求的请求参数。
⽽某些并发程序,只需要对其中某⼏个参数做并发控制,例如时间段,OU等。
对于这种业务需求,可以使⽤标准包DBMS_LOCK,把需要做并发控制的参数,加上锁,实现并发控制。
不兼容设置:例如:在调⽤并发的程序时,假设两个⼈同时提交了某⼀个并发请求,并且传⼊了同样的参数,假设在程序中使⽤了对状态的控制,例如在刚进⼊main函数的时候马上就将状态update 了,那么其中某⼀个⼈就会查不到该条数据最后请求没有执⾏。
也可以使⽤另外⼀种⽅法,使⽤DBMS_LOCK,将提交的并发锁住,其他提交的只能排队。
DBMS_LOCK相关知识介绍锁模式名字描述数据类型值nl_mode Null INTEGER1 ss_mode Sub Shared:used on an aggregate object to indicate tINTEGER2aht share locks are being acquired on subparts of theobject(对象的⼦部分,加上了Share锁)INTEGER3 sx_mode Sub Exclusive:used on an aggregate object to indicate that exclusive locks are being acquired on subpartsof the object(对象的⼦部分,加上了Exclusive锁)INTEGER4 s_mode Shared:indicates that the entire aggregatr object has ashare lock,but some of the sub-parts may additionlly have exclusive locks(对象加上了Share锁)INTEGER5 ssx_mode Shared SubExclusive(对象加上了Share锁,其⼦部分加上了Exclusive锁)x_mode Exclusive(对象加上了Exclusive锁)INTEGER6锁兼容性NL SS SX S SSX XNL SUCC SUCC SUCC SUCC SUCC SUCCSS SUCC SUCC SUCC SUCC SUCC FAILSX SUCC SUCC SUCC FAIL FAIL FAILS SUCC SUCC FAIL SUCC FAIL FAILSSX SUCC SUCC FAIL FAIL FAIL FAILX SUCC FAIL FAIL FAIL FAIL FAIL DBMS_LOCK Procedure1、ALLOCATE_UNIQUESql代码:1. dbms_lock.request(lockhandle IN VARCHAR2,2. lockmode IN INTEGER DEFAULT x_mode,3. timeout IN INTEGER DEFAULT maxwait,4. release_on_commit IN BOOLEAN DEFAULT FALSE) RETURN INTEGER;说明:锁模式转换。
oracle sql并发insert写法
oracle sql并发insert写法在Oracle SQL中,并发插入数据可以使用以下几种方式来实现:1. 使用INSERT ALL语句:可以在一条INSERT语句中插入多个行。
例如:```INSERT ALLINTO table_name (column1, column2, column3) VALUES('value1', 'value2', 'value3')INTO table_name (column1, column2, column3) VALUES('value4', 'value5', 'value6')SELECT 1 FROM DUAL;```这样可以在一次数据库访问中插入多个行,提高性能。
2. 使用并发控制机制:可以使用锁机制来确保并发插入的正确性。
例如,可以使用SELECT FOR UPDATE NOWAIT语句获取行级锁,然后再执行INSERT语句来插入数据。
```LOCK TABLE table_name IN EXCLUSIVE MODE NOWAIT; -- 或者SELECT * FROM table_name FOR UPDATE NOWAIT;-- 执行插入语句INSERT INTO table_name (column1, column2, column3) VALUES ('value1', 'value2', 'value3');```这样可以确保同一时间只有一个用户可以对表进行插入操作,避免并发插入冲突。
3. 使用多个会话并发插入:可以创建多个数据库会话,每个会话分别执行插入操作。
这样可以利用 Oracle 数据库的并行处理能力来提高插入数据的并发性能。
以上是一些常见的实现并发插入的方法,可以根据具体需求选择适合的方法。
Oracle常见死锁发生的原因以及解决方法
Oracle常见死锁发生的原因以及解决方法死锁是指在并发程序中,两个或多个进程因为争夺系统资源而陷入无限等待的状态,从而无法继续执行下去。
在Oracle数据库中,死锁是一个非常常见的问题,它会导致系统性能下降,甚至造成系统崩溃。
本文将详细介绍Oracle常见死锁发生的原因以及解决方法。
一、死锁发生的原因1.竞争资源:当多个进程同时请求相同的资源时,可能会导致死锁的发生。
例如,如果两个进程同时请求一个表的写锁,那么它们就会陷入死锁状态。
2.锁的顺序:当多个进程按照不同的顺序请求锁时,可能会导致死锁的发生。
例如,如果进程A先请求资源X,再请求资源Y,而进程B先请求资源Y,再请求资源X,那么它们就会陷入死锁状态。
3.锁的持有时间:当一个进程持有一个锁,并且在等待其他资源时继续保持该锁,可能会导致死锁的发生。
例如,如果进程A持有资源X的锁,并且在等待资源Y时继续保持该锁,而进程B持有资源Y的锁,并且在等待资源X时继续保持该锁,那么它们就会陷入死锁状态。
二、死锁的解决方法1. 死锁检测和解除:Oracle数据库提供了死锁检测和解除的机制。
当一个进程请求一个资源时,数据库会检查是否存在死锁。
如果存在死锁,数据库会选择一个进程进行回滚,解除死锁状态,并且通知其他进程重新尝试获取资源。
2.超时设置:为了避免死锁的发生,可以设置超时时间。
当一个进程请求一个资源时,如果在指定的超时时间内无法获取资源,那么就放弃该请求,并且释放已经持有的资源。
这样可以防止死锁的发生,但是会增加系统的开销。
3.锁的顺序:为了避免死锁的发生,可以规定所有进程按照相同的顺序请求锁。
例如,可以规定所有进程按照资源的名称进行排序,然后按照顺序请求锁。
这样可以避免死锁的发生,但是可能会影响系统的性能。
4.锁的粒度:为了避免死锁的发生,可以尽量减小锁的粒度。
例如,可以将一个大的锁分解成多个小的锁,这样可以减少锁的冲突,降低死锁的概率。
但是需要注意的是,锁的粒度过小可能会导致系统的性能下降。
Oracle笔试题库附参考答案
Oracle笔试题库附参考答案1.下列不属于ORACLE的逻辑结构的是(C)1. 区2. 段3. 数据⽂件4. 表空间2. 下⾯哪个⽤户不是ORACLE缺省安装后就存在的⽤户(A)A . SYSDBAB. SYSTEMC. SCOTTD. SYS3 下⾯哪个操作会导致⽤户连接到ORACLE数据库,但不能创建表(A)1. 授予了CONNECT的⾓⾊,但没有授予RESOURCE的⾓⾊2. 没有授予⽤户系统管理员的⾓⾊3. 数据库实例没有启动4. 数据库监听没有启动1. ( )函数通常⽤来计算累计排名,移动平均数和报表聚合。
A . 汇总B. 分析C 分组、D 单⾏1. 带有(B)字句的SELECT语句可以在表的⼀⾏或多⾏放置排他锁。
A . FOR INSERTB. FOR UPDATEC. FOR DELETED. FOR REFRESH1. 在Oracle中,你以SYSDBA登录,CUSTOMER表位于Mary⽤户⽅案中,下⾯哪条语句为数据库中的所有⽤户创建CUSTOMER表的同义词(B)。
1. CREATE PUBLIC SYNONYM cust ON mary.customer;2. CREATE PUBLIC SYNONYM cust FOR mary.customer;3. CREATE SYNONYM cust ON mary.customer FOR PUBLIC;4. 不能创建CUSTOMER的公⽤同义词。
5.7. 在Oracle中,当FETCH语句从游标获得数据时,下⾯叙述正确的是(C)。
1. 游标打开2. 游标关闭3. 当前记录的数据加载到变量中4. 创建变量保存当前记录的数据8. 在Oracle中,下⾯关于函数描述正确的是(AD)。
1. SYSDATE函数返回Oracle服务器的⽇期和时间2. ROUND数字函数按四舍五⼊原则返回指定⼗进制数最靠近的整数3. ADD_MONTHS⽇期函数返回指定两个⽉份天数的和4. SUBSTR函数从字符串指定的位置返回指定长度的⼦串9. 阅读下⾯的PL/SQL程序块:BEGININSERT INTO employee(salary,last_name,first_name)VALUES(35000,’Wang’,'Fred’);SAVEPOINT save_a;INSERT INTO employee(salary,last_name,first_name)VALUES(40000,’Woo’,'David’);SAVEPOINT save_b;DELETE FROM employee WHERE dept_no=10;SAVEPOINT save_c;INSERT INTO employee(salary,last_name,first_name)VALUES(25000,’Lee’,'Bert’);ROLLBACK TO SAVEPOINT save_c;VALUES(32000,’Chung’,'Mike’);ROLLBACK TO SAVEPOINT save_b;COMMIT;END;运⾏上⾯的程序,哪两个更改永久保存到数据库(CD)。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
在Oracle中使用锁进行并发控制
现在主流的数据库管理系统中,都支持多个事务同时执行,这样提高了数据库管理系统的运行效率。
试想如果只允许一个事务运行,而这个事务又需要很长的时间,那么其他的用户必须一直等待该事务结束,效率何其低下。
执行不同的事务虽然可以提高性能,但是有可能会破坏数据的完整性,所以我们必须在性能和数据完整性之间进行权衡。
那么什么是并发控制呢?并发控制是数据库管理系统协调多个运行事务的行为。
首先了解一下,并发控制中经常遇到的三个问题。
脏读
我们通过一个products表来解释一下什么是脏读,该products表有一列quantity(数量),现在的值为20。
假如现在有两个事务T1和T2,它们都是要更新quantity列,T1将该列值加100,T2将此列减10,但是T1执行失败进行了回滚。
我们很容易计算出正确的结果20-10=10,但是如果事务按照以下方式运行,能够得出什么结果?
时间事务步骤存储值
1T1读出quantity的值20
2T1quantity=20+100120
3T1写入quantity值120
4T2读出quantity(T1未提交)120
5T2quantity=120-10110
6T1回滚(rollback)20
7T2写入quantity值110
以上得出了110的结果,显然是不正确的,问题就在于T2读取到了T1没有提交的数据,我们把这种情况就称之为脏读。
不可重复读
还是事务T1和T2,它们都是要更新quantity列,T1将该列值加100,T2将此列减10,而且两个事务都成功。
我们很容易计算出正确的结果
20+100-10=110,但是如果事务按照以下方式运行,能够得出什么结果?
时间事务步骤存储值
1T1读出quantity的值20
2T2 读出quantity的值20
3T1quantity=20+100120
4T2quantity=20-1010
5T1 写入quantity值(更新丢失) 110
6T2 写入quantity值10
得出了10的结果,仍然是不正确的。
问题就在于T2的值覆盖了T1的值,我们把这种情况称之为不可重复读。
幻觉读
例如T1对一个表中的所有行修改,同时T2向该表中插入一行记录。
这时在
T1中就会发生还有没有被修改的数据行,就好象发生了幻觉一样。
SQL92标准定义了四种隔离级别,以解决以上问题,四种隔离级别如下图所示:
Oracle提供了三种隔离级别,分别是Read Committed Serializable和Read Only。
Read Committed是Oracle的默认隔离级别,可以看出这种隔离级别消除了脏读,但是避免不了不可重复读和幻觉读的发生,不过一般的应用还是可以使用该隔离级别的。
Serializable这种隔离级别可以消除以上三个问题,但是效率会降低很多。
Read Only隔离级别不是SQL92标准中定义的,它不允许事务进行更新操作,这种隔离级别也可以消除脏读。
Oracle中在事务开始之前可以通过以下方式设置隔离级别:
以下是代码片段:
set transation isolation level read committed;
set transation isolation level serialezable;
set transation isolation level read only;
也可以在单独的会话中设置隔离级别:
以下是代码片段:
alter session set isolation_level read committed;
alter session set isolation_level serialezable;
alter session set isolation_level read only;
通过刚才的介绍,我们知道了可以设置隔离级别来降低或者消除数据的不完整性,那数据库管理系统是怎么做到这一点的呢?答案是,采用锁。
锁可以保护数据,当一个事务修改数据时,锁会将该数据锁定,防止这些数据在同一时刻被其它事务修改。
大多数情况下,我们可以不必自己管理锁,Oracle会自动创建并管理,但是了解锁是如何工作的,对我们来说也是非常有必要的。
下列这些情况Oracle会创建锁:当我们运行了create truncate alter语句时,Oracle会创建锁,称之为DDL 锁。
当我们运行了insert update delete语句,Oracle会创建锁,称之为DML 锁。
还有一种是内部锁,由Oracle在内部使用,比如管理数据文件。
在这里我们不做介绍。
从级别上讲,锁还可以分为数据库级别锁、表级别锁、行级别锁和列级别锁(Oracle不支持)。
1、数据库级别锁:它会锁定数据库以禁止任何新会话和新事务。
锁定数据库的最主要目的是在没有用户干扰的情况下完成维护。
在Oracle中使用以下语句锁定数据库为限制模式:
alter system enable restricted session;
通过下列语句取消数据库限制模式:
alter system disable restricted session;
以下语句将锁定数据库为只读模式:
startup mount;
alter database open read only;
2、表级别锁:它会锁定整张表,以防止其它事务对表结构进行修改。
比如当我们运行一个insert语句,如果表没有没锁定,其它的事务修改了一列(将列名修改),这时我们运行update语句就会出错,所以当我们运行DML语句时,Oracle 会自动将表锁定,DML语句执行完,会释放表级别锁。
我们也可以通过lock语句锁定表。
3、行级别锁:当我们运行DML语句时,当前行上就会有行级别锁,防止其它事务对该行进行修改。
当我们运行DML语句时,Oracle会自动加锁,请看以下示例:
update dept set loc='北京' where deptno=40;
然后在Oracle的企业管理器中观察Oracle自动管理的锁,如下图:
从上图中我们可以看到,我们运行了一个update语句,产生了两个锁,都是scott用户,SID表示会话是10,锁类型TX表示表级别锁,而TX表示行级别锁,占用的模式我们后面给大家介绍。
锁类型:TM 锁模式:share某个事务锁定了一张表,允许其它事务再锁定这张表,但不允许这个事务对这张表进行更新。
锁类型:TM 锁模式:row share 某个事务锁定了一张表,允许其它事务再锁定这张表中的其它行。
锁类型:TM 锁模式:row eclusive 某个事务锁定了一张表,允许其它事务以相同的锁模式锁定这张表。
锁类型:TM 锁模式:share row eclusive 在share模式基础上,不允许其它事务锁定这张表。
锁类型:TM 锁模式:eclusive不允许其它事务再锁定该表,也不允许其它事务更新。
锁类型:TX 锁模式:eclusive该行已经被锁定,不允许其它事务锁定。