oracle事务锁如何用 事务在oracle中的应用

ORACLE里几种锁模式ORACLE锁具体分为以下几类:
1.按用户与系统划分,可以分为自动锁与显示锁
自动锁:当进行一项数据库操作时,缺省情况下,系统自动为此数据库操作获得所有有必要的
显示锁:某些情况下 , 需要用户显示的锁定数据库操作要用到的数据,才能使数据库操作执行得更好,显示锁是用户为数据库对象设定的 。
2.按锁级别划分,可分为共享锁与排它锁
共享锁:共享锁使一个事务对特定数据库资源进行共享访问——另一事务也可对此资源进行访问或获得相同共享锁 。共享锁为事务提供高并发性 , 但如拙劣的事务设计 共享锁容易造成死锁或数据更新丢失 。
排它锁:事务设置排它锁后,该事务单独获得此资源,另一事务不能在此事务提交之前获得相同对象的共享锁或排它锁 。
3.按操作划分,可分为DML锁、DDL锁
DML锁又可以分为,行锁、表锁、死锁
-行锁:当事务执行数据库插入、更新、删除操作时,该事务自动获得操作 表中操作行的排它锁 。
-表级锁:当事务获得行锁后 , 此事务也将自动获得该行的表锁(共享锁),以防止其它事务进行DDL语句影响记录行的更新 。事务也可以在进行 过程中获得共享锁或排它锁,只有当事务显示使用LOCK TABLE语 句显示的定义一个排它锁时,事务才会获得表上的排它锁,也可使用
LOCK TABLE显示的定义一个表级的共享锁(LOCK TABLE具体用法请参 考相关文档) 。
-死锁:当两个事务需要一组有冲突的锁,而不能将事务继续下去的话,就 出现死锁 。
如事务1在表A行记录#3中有一排它锁,并等待事务2在表A中记录#4 中排它锁的释放 , 而事务2在表A记录行#4中有一排它锁,并等待事务 1在表A中记录#3中排它锁的释放,事务1与事务2彼此等待,因此就造 成了死锁 。死锁一般是因拙劣的事务设计而产生 。
死锁只能使用SQL下:alter system kill session 'sid,serial#';
或者使用相关操作系统kill进程的命令,如UNIX下kill -9 sid,或者 使用其它工具杀掉死锁进程 。
DDL锁又可以分为:排它DDL锁、共享DDL锁、分析锁
-排它DDL锁:创建、修改、删除一个数据库对象的DDL语句获得操作对象的 排它锁 。
如使用alter table语句时,为了维护数据的完成性、一致性、
合法性,该事务获得一排它DDL锁 。
-共享DDL锁:需在数据库对象之间建立相互依赖关系的DDL语句通常需共享
获得DDL锁 。
如创建一个包 , 该包中的过程与函数引用了不同的数据库表,
当编译此包时,该事务就获得了引用表的共享DDL锁 。
-分析锁:ORACLE使用共享池存储分析与优化过的SQL语句及PL/SQL程序,使
运行相同语句的应用速度更快 。一个在共享池中缓存的对象获得
它所引用数据库对象的分析锁 。分析锁是一种独特的DDL锁类型 ,
ORACLE使用它追踪共享池对象及它所引用数据库对象之间的依赖 关系 。当一个事务修改或删除了共享池持有分析锁的数据库对象
时,ORACLE使共享池中的对象作废,下次在引用这条SQL/PLSQL语 句时,ORACLE重新分析编译此语句 。
4.内部闩锁
内部闩锁:这是ORACLE中的一种特殊锁 , 用于顺序访问内部系统结构 。
当事务需向缓冲区写入信息时 , 为了使用此块内存区域, ORACLE首先必须取得这块内存区域的闩锁,才能向此块内存写入
信息 。
Oracle中的锁锁是数据库用来控制共享资源并发访问的机制 。
例如
用户A执行了
update tb1 set name='xx' where id=1;
那么在用户A没提交前表tb1的id=1的行就是锁着的,其它用户想要修改必需等A用户提交后才能执行修改任务 。
当然ORACLE的锁有很多种,比如行级锁、表级锁等等
下面是一些复制来的希望对你有帮助
锁是数据库用来控制共享资源并发访问的机制 。
锁用于保护正在被修改的数据
直到提交或回滚了事务之后,其他用户才可以更新数据
锁定的优点
一致性- 一次只允许一个用户修改数据
完整性- 为所有用户提供正确的数据 。如果一个用户进行了修改并保存,所做的修改将反映给所有用户
锁的类型
行级锁
对正在被修改的行进行锁定 。其他用户可以访问除被锁定的行以外的行
行级锁是一种排他锁,防止其他事务修改此行
在使用以下语句时,Oracle会自动应用行级锁:INSERTUPDATEDELETESELECT …FOR UPDATESELECT …FOR UPDATE语句允许用户一次锁定多条记录进行更新
使用COMMIT或ROLLBACK语句释放锁
SELECT …FOR UPDATE语法:SELECT …FOR UPDATE [OF columns][WAIT n | NOWAIT];
SQL SELECT * FROM order_master WHERE vencode=’V002’
FOR UPDATE OF odate, del_date;
SQL UPDATE order_master SET del_date=’28-8月-05’
WHERE vencode=’V002’;
SQL COMMIT;
SQL SELECT * FROM order_master WHERE vencode=’V002’
FOR UPDATE WAIT 5;
SQL SELECT * FROM order_master WHERE vencode=’V002’
FOR UPDATE NOWAIT;
使用命令显示地锁定表,应用表级锁的语法是:
LOCK TABLE table_name IN mode MODE;
行共享(ROW SHARE) – 禁止排他锁定表
行排他(ROW EXCLUSIVE) – 禁止使用排他锁和共享锁
共享锁(SHARE)
锁定表,仅允许其他用户查询表中的行
禁止其他用户插入、更新和删除行
多个用户可以同时在同一个表上应用此锁
共享行排他(SHARE ROW EXCLUSIVE) – 比共享锁更多的限制 , 禁止使用共享锁及更高的锁
排他(EXCLUSIVE) – 限制最强的表锁,仅允许其他用户查询该表的行 。禁止修改和锁定表
表级锁
占用模式其他用户
ROW SHAREROW EXCLUSIVESHARESHARE ROW EXCLUSIVEEXCLUSIVESELECT..FOR UPDATEINSERT DELETE UPDATE
ROW SHARE√√√√×√√
ROW EXCLUSIVE√√×××√√
SHARE√×√××√×
SHARE ROW EXCLUSIVE√××××√×
EXCLUSIVE×××××××
死锁
当两个事务相互等待对方释放资源时,就会形成死锁
Oracle会自动检测死锁 , 并通过结束其中的一个事务来解决死锁
右边是一个死锁的例子
Oracle怎么显式开启事务,开始事务跟锁有什么关系,在存储过程中有时怎么开启和提交,回滚事务的oracle使用语句savepoint sp_begintran开启显式事务,锁本身和事务是没有关系oracle事务锁如何用的 , 只要是数据库oracle事务锁如何用的操作都会产生锁 。处于事务中的SQL语句只有这个事务提交(commit)之后,事务中的SQL语句影响的表记录上的锁才会释放 。锁常见有共享锁(select语句产生)和排它锁(DML语句产生),如果一个表上加载有共享锁,还可以叠加共享锁 , 但不能叠加排它锁 。如果一个表上加载有排oracle事务锁如何用他锁 , 就什么锁都不能加了 , 也就是说如果DML语句占用过多的时间 , 这些数据库效率就不高,就需要优化 , 当然select语句性能低了也不行 。
每个存储过程可以不用显式事务,它本身就为你开启了一个隐式事务,如果需要开启显示事务,就通过savepoint sp_begintran开启,无论是不是显式还是隐式事务,你都得通过commit work提交事务,通过exception捕捉SQL语句异常,在异常发生时需要回滚事务(rollback work) 。
oracle中的锁有什么作用?都有什么锁?之间有什么区别?谢谢数据库是一个多用户使用的共享资源 。当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况 。若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性 。加锁是实现数据库并发控制的一个非常重要的技术 。当事务在对某个数据对象进行操作前,先向系统发出请求,对其加锁 。加锁后事务就对该数据对象有了一定的控制,在该事务释放锁之前,其他的事务不能对此数据对象进行更新操作 。在数据库中有两种基本的锁类型:排它锁(Exclusive Locks,即X锁)和共享锁(Share Locks,即S锁) 。当数据对象被加上排它锁时 , 其他的事务不能对它读取和修改 。加了共享锁的数据对象可以被其他事务读?。荒苄薷?。数据库利用这两种基本的锁类型来对数据库的事务进行并发控制 。根据保护的对象不同,Oracle数据库锁可以分为以下几大类: DML锁(data locks,数据锁),用于保护数据的完整性; DDL锁(dictionary locks,字典锁),用于保护数据库对象的结构,如表、索引等的结构定义; 内部锁和闩(internal locks and latches),保护数据库的内部结构,应用于SGA; 在我们实际应用开发中涉及较多的是DML锁,其他两种的话DBA会更加关心点; DML锁的目的在于保证并发情况下的数据完整性,主要包括TM锁和TX锁,其中TM锁称为表级锁,TX锁称为事务锁或行级锁 。当Oracle执行DML语句时 , 系统自动在所要操作的表上申请TM类型的锁 。当TM锁获得后,系统再自动申请TX类型的锁,并将实际锁定的数据行的锁标志位进行置位 。这样在事务加锁前检查TX锁相容性时就不用再逐行检查锁标志,而只需检查TM锁模式的相容性即可,大大提高了系统的效率 。TM锁包括了SS、SX、S、X等多种模式,在数据库中用0-6来表示 。不同的SQL操作产生不同类型的TM锁 。如下图所示: 值 锁模式 锁描述 SQL 0 NONE 1 NULL 空 SELECT 2 SS(ROW-S) 行级共享锁 其他对象只能查询这些数据行 SELECT FOR UPDATE、LOCK FOR UPDATE、 LOCK ROW SHARE 3 SX(ROW-X) 行级排它锁 在提交前不允许做DML操作 INSERT、UPDATE、DELETE、 LOCK ROW SHARE 4 S(SHARE) 共享锁 CREATE INDEX、LOCK SHARE 5 SSX(S/ROW-X) 共享行级排它锁 LOCK SHARE ROW EXCLUSIVE 6 X(eXclusive) 排它锁 ALTER TABLE、DROP TABLE、DROP INDEX、 TRUNCATE TABLE、LOCK EXCLUSIVE 在数据行上只有X锁(排他锁) 。在 Oracle数据库中,当一个事务首次发起一个DML语句时就获得一个TX锁,该锁保持到事务被提交或回滚 。当两个或多个会话在表的同一条记录上执行 DML语句时 , 第一个会话在该条记录上加锁,其他的会话处于等待状态 。当第一个会话提交后,TX锁被释放 , 其他会话才可以加锁 。在大概了解oracle的锁机制之后,我们来解决几个基本的问题: 1.UPDATE/DELETE操作会将RS锁定,直至操作被COMMIT或者ROLLBACK; 若操作未COMMIT之前其他session对同样的RS做变更操作 , 则操作会被hold,直至前session的UPDATE/DELETE操作被COMMIT; 2.session内外SELECT的RS范围 前提:INSERT、UPDATE操作未COMMIT之前进行SELECT; 若在同一session内,SELECT出来的RS会包括之前INSERT、UPDATE影响的记录; 若不在同一session内,SELECT出来的RS不会包括未被COMMIT的记录; 3.SELECT.... FOR UPDATE [OF cols] [NOWAIT/WAIT] [SKIP LOCKED] OF cols:只锁定指定字段所在表的RS,而没有指定的表则不会锁定,只会在多表联合查询时出现; NOWAIT:语句不会hold,而是直接返回错误ORA-0005
【oracle事务锁如何用 事务在oracle中的应用】oracle事务锁如何用的介绍就聊到这里吧,感谢你花时间阅读本站内容 , 更多关于事务在oracle中的应用、oracle事务锁如何用的信息别忘了在本站进行查找喔 。

    推荐阅读