- 浏览: 972702 次
- 性别:
- 来自: 山西
文章分类
最新评论
-
白小默:
你好 可以提供下源码DEMO吗,不知为何,我导出来的excel ...
jxls 使用模板文件导出生成excel -
zkzqzzz:
博主威武!
让微信二维码扫描您的APK -
zkzqzzz:
感谢博主 原来那些类都不是必须的 或者自己写!!博主真棒 ...
抢红包插件实现原理浅析 -
zkzqzzz:
博主 请问你的其他类在哪里呢?
抢红包插件实现原理浅析 -
zkzqzzz:
其他类在哪呢?
抢红包插件实现原理浅析
加锁是实现数据库并发控制的一个非常重要的技术。当事务在对某个数据对象进行操作前,先向系统发出请求,对其加锁。加锁后事务就对该数据对象有了一定的控制,在该事务释放锁之前,其他的事务不能对此数据对象进行更新操作。
在数据库中有两种基本的锁类型:排它锁(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 update(nowait)
Select * 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语句会产生阻塞
INSERT
UPDATE
DELETE
SELECT…FOR UPDATE
INSERT
Insert发生阻塞的唯一情况就是用户拥有一个建有主键约束的表。当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锁分类表
表1Oracle的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 able、Drop index、Truncate table 、Lock exclusive
oracle 锁问题的解决
可以用Spotlight软件对数据库的运行状态进行监控。
当出现session锁时,我们要及时进行处理.
1. 查看哪些session锁:
SQL语句:select 'alter system kill session '''||sid||','||serial#||''';' from v$session where sid in (select sid from v$lock where block = 1);
SQL> select 'alter system kill session '''||sid||','||serial#||''';' from v$session where sid in (select sid from v$lock where block = 1);
'ALTERSYSTEMKILLSESSION'''||SID||','||SERIAL#||''';'
--------------------------------------------------------------------------------
alter system kill session '132,731';
alter system kill session '275,15205';
alter system kill session '308,206';
alter system kill session '407,3510';
2. 查看session锁.
sql语句:select s.sid, q.sql_text from v$sqltext q, v$session s
where q.address = s.sql_address
and s.sid = &sid
order by piece;
SQL> select s.sid,q.sql_text from v$sqltext q, v$session s where q.address = s.sql_address and s.sid in (select sid from v$lock where block = 1) order by piece;
SID SQL_TEXT
---------- ----------------------------------------------------------------
77 UPDATE PROFILE_USER SET ID=1,COMPANY_ID=2,CUSTOMER_ID=3,NAMED
77 _INSURED_ID=4,LOGIN=5,ROLE_ID=6,PASSWORD=7,EMAIL=8,TIME_ZON
77 E=9 WHERE PROFILE_USER.ID=:34
3 rows selected.
3. kill锁的进程.
SQL语句:alter system kill session '77,22198';
SQL> alter system kill session '391,48398';
System altered.
4. 查看谁锁了谁。
select s1.username || [email='@']'@'[/email] || s1.machine
|| ' ( SID=' || s1.sid || ' ) is blocking '
|| s2.username || [email='@']'@'[/email] || s2.machine || ' ( SID=' || s2.sid || ' ) ' AS blocking_status
from v$lock l1, v$session s1, v$lock l2, v$session s2
where s1.sid=l1.sid and s2.sid=l2.sid
and l1.BLOCK=1 and l2.request > 0
and l1.id1 = l2.id1
and l2.id2 = l2.id2 ;
注:
> : 重定向输出,将文件的标准输出重新定向输出到文件,或将数据文件作为另一程序的标准输入内容。
| :UNIX管道:将一文件的输出作为另一文件的输入.
在执行SQL语句试:alter system kill session '391,48398'(sid为391); 应当注意对于sid在100以下的应当谨慎,可能该进程对应某个application,如对应某个事务,可以kill. <!--v:3.2-->
发表评论
-
oracle 12c与其他版本的几点区别
2019-02-14 10:23 914oracle 12c与其他版本的几点区别 ... -
JDBC连接ORACLE 12C PDB数据库
2019-01-28 17:37 780JDBC连接ORACLE 12C PDB数据库 ... -
JDBC连接ORACLE数据库的几种方式
2019-01-28 16:17 901格式一: Oracle JDBC Thin using a ... -
Oracle JDBC连接服务名、SID和tnsnames.ora配置的多种方式
2019-01-28 10:35 551昨天,领导安排去新服务器上部署项目,给了我数据库地址,服 ... -
【Oracle RAC】JDBC连接oracle RAC数据库配置
2018-10-10 15:09 462问题描述 生产上线系统,未能及时识别到Oracle数据库 ... -
jdbc连接Oracle使用SID与SERVICE NAME的方法 集群连接配置
2018-09-12 16:47 1695有三种连接串的写法 1.使用SERVICE NAME连接 ... -
dbca创建数据库不同模板之间的区别
2017-09-28 10:36 395这篇文章讨论通过dbca创建数据库,默认模板之间的区别 ... -
Oracle启动监听报错:The listener supports no services解决
2017-09-25 18:03 972$ lsnrctl start 报错提示: The li ... -
linux使用VNC服务轻松远程安装oracle
2017-09-20 23:04 609转:https://www.2cto.com/databa ... -
linux操作系统下oracle数据库如何配置监听
2017-09-20 16:31 5521. 修改监听器配置文件Linux下Oracle监听器配置文件 ... -
oracle database link使用说明
2017-08-17 18:05 445作用:将多个oracle数据 ... -
oracle删除DBF文件
2017-03-28 16:24 553曾经以为把所有的表清空drop掉后其文件已经删除 ... -
oracle进行分组后,取出每组的前几条数据
2016-03-24 21:48 556SELECT * FROM ( ... -
Linux Oracle服务启动&停止脚本与开机自启动
2014-09-23 15:01 548在CentOS 6.3下安装完Oracl ... -
oracle 查询按月份分组
2014-09-11 11:44 567如下表table1: 日期(export ... -
oracle:进行分组并取每组中的前n条记录
2014-08-26 08:53 797关键字: oracle 分组 前n条记录 ... -
批量将PowerDesigner中表字段由小写变成大写
2012-05-07 09:16 1278因项目需要将项目数据库由sqlserver转为oracle, ... -
Oracle的varchar2(4000)插入汉字过长
2012-04-23 11:18 928Oracle的varchar2(4000)插入汉字过长 . ... -
Oracle时间日期操作
2012-01-06 16:41 678sysdate+(5/24/60/60) 在系统时间基础上延迟 ... -
oracle查询:取出每组中的第一条记录
2011-12-27 12:51 929按type字段分组,code排序,取出每组中的第一条记录 ...
相关推荐
在Oracle数据库中,DML锁主要包括TM锁和TX锁,其中TM锁称为表级锁(用来保证表的结构不被用户修改),TX锁称为事务锁或行级锁。当Oracle执行DML语句时,系统自动在所要操作的表上申请TM类型的锁。当TM锁获得后,系统...
### Oracle 锁机制问题详解 #### 一、引言 在多用户数据库环境中,当多个用户尝试同时访问或修改同一份数据时,就需要通过锁机制来确保数据的一致性和完整性。Oracle 数据库提供了多种类型的锁来支持事务隔离级别,...
关于oracle锁以及并发的详细描述。
以下是对Oracle锁机制的详细解释: 1. **锁的存在原因**: - 并发控制:在多用户环境下,多个事务可能同时访问相同的数据,锁用于防止冲突,确保每个事务看到的是一个一致的数据视图。 - 数据一致性:通过锁,...
Oracle的锁机制是数据库管理系统中一个关键的组成部分,它的主要目标是确保在多用户环境下,数据的读一致性、完整性和并行性。Oracle提供了多种类型的锁来满足这些需求。 首先,按照是否独占,锁分为排它锁(X锁)...
Oracle数据库多粒度锁机制介绍概述.内容简单易懂,容易掌握
#### Oracle锁的类型与模式 1. **行级锁**:当一个事务尝试修改某一行时,Oracle会自动对该行加锁,阻止其他事务同时修改同一行。这种锁称为行级锁,是最细粒度的锁。 2. **表级锁**:在某些情况下,整个表可能被...
Oracle数据库的锁机制是确保多用户并发访问时数据一致性的重要工具。在数据库环境中,当多个事务同时尝试访问和修改同一数据对象时,如果没有适当的控制,可能会导致数据的不一致性和并发问题。为了解决这些问题,...
oracle数据库锁机制常备大家所诟病,希望对学习者有帮助,大家自觉学习
#### 一、Oracle锁机制简介 在Oracle数据库中,锁是一种重要的并发控制机制,用于管理多个用户对同一数据资源的访问。通过锁机制,Oracle能够确保数据的一致性和完整性,避免多用户操作时可能出现的数据冲突问题。 ...
总结,Oracle锁机制是数据库并发控制的核心,理解并熟练掌握锁的使用和管理对于优化数据库性能、避免并发问题至关重要。通过使用适当的工具和技巧,我们可以有效地监控和解决锁相关问题,从而提高系统的稳定性和响应...
总之,Oracle锁机制是其并发控制的核心,通过精细的锁类型和模式,Oracle能够在保证数据一致性的同时,支持多个并发事务高效地访问数据库资源。了解并掌握Oracle锁的原理和应用,对于优化数据库性能和解决并发问题至...
oracle并发和锁机制,oracle并发锁,oracle锁
### Oracle锁机制详解 #### 锁的基本概念与作用 锁机制是Oracle数据库中用于管理并发访问共享资源的关键组件。在多用户环境中,确保数据的一致性和完整性至关重要,尤其是在多个会话试图同时修改相同数据的情况下...
ORACLE 锁机制和 V$LOCK 视图分析 Oracle 数据库为了实现并发操作,使用了锁机制来控制对数据的访问。锁机制是 Oracle 数据库并发控制的核心机制之一。锁机制能够有效地防止多个用户同时访问同一个数据项,避免了...