阻塞
如果一个会话持有某个资源的锁,而另一个会话在请求这个资源,就会出现阻塞(blocking
)。这样一来,请求的会话会被阻塞,它会“挂起”,直至持有锁的会话放弃锁定的资源。
数据库中有5
条常见的DML
语句可能会阻塞,具体是:INSERT
、UPDATE
、DELETE
、MERGE
和SELECT
FOR UPDATE
。对于一个阻塞的SELECT FOR
UPDATE
,解决方案很简单:只需增加NOWAIT
子句,它就不会阻塞了。
例子
时间点
|
Session1
|
Session2
|
T1
|
开始事务
|
|
T2
|
|
开始事务
|
T3
|
Update A set
col1=2 where id=1
获得id
为1
的行的排它锁(X
)
|
|
T4
|
|
Update A set
col1=5 where id=1
等待session1
释放id
为1
的行的排它锁(X
)
|
T5
|
commit
|
|
T6
|
|
commit
|
在上面的例子中
Session1
在T3
时刻获得id
为1
的行的排它锁(X),
在T4
时刻,session2
也要更新该行,也要在行上加排它锁(X
),由于session1
的事务还没有提交,因此session2
这个时候就被阻塞了,只到session1
的事务提交或回滚后session2
也获得此行的排它锁(X
)使事务得以进行。
死锁
如果你有两个会话,每个会话都持有另一个会话想要的资源,此时就会出现死锁(deadlock
)。
例子
时间点
|
Session1
|
Session2
|
T1
|
开始事务
|
|
T2
|
|
开始事务
|
T3
|
Update A set
col1=2 where id=1
获得id
为1
的行的排它锁(X
)
|
|
T4
|
|
Update B set
col1=5 where id=4
获得id
为4
的行的排它锁(X
)
|
T5
|
Update B set
col1=6 where id=4
等待session2
释放id
为4
的行的排它锁(X
)
|
|
T6
|
|
Update A set
col1=8 where id=1
等待session1
释放id
为1
的行的排它锁(X
)
|
T7
|
commit
|
|
T8
|
|
commit
|
在上面的例子中
Session1
在T3
时刻获得表A
的id
为1
的行的排它锁(X),
在T4
时刻,session2
获得表B
的id
为4
的行的排它锁(X),T5
时刻,session1
要更新表B
的id
为4
的行,要在行上加排它锁(X
),由于session2
的事务还没有提交,因此session1
这个时候就被阻塞了,T6
时刻session2
要更新表A
的id
为1
的行,要在行上加排它锁(X
),由于session1
的事务还没有提交,因此session2
这个时候就被阻塞了,这时两个会话都被对方阻塞了于是死锁就发生了。
在oracle
中,oracle
会自己检测死锁,一旦检测到就会回滚该语句,在这个例子中oracle
会在T6
时刻检测到死锁并回滚该语句,但session2
在T4
上仍然保持着锁,因此session1
还是不能继续进行。
即使对同一个表操作也会出现死锁的情况
时间点
|
Session1
|
Session2
|
T1
|
开始事务
|
|
T2
|
|
开始事务
|
T3
|
Update A set
col1=2 where id=1
获得id
为1
的行的排它锁(X
)
|
|
T4
|
|
Update A set
col1=5 where id=4
获得id
为4
的行的排它锁(X
)
|
T5
|
Update A set
col1=6 where id=4
等待session2
释放id
为4
的行的排它锁(X
)
|
|
T6
|
|
Update A set
col1=8 where id=1
等待session1
释放id
为1
的行的排它锁(X
)
|
T7
|
commit
|
|
T8
|
|
commit
|
分享到:
相关推荐
这是国内第一本深度讲解如何架构与设计高并发Oracle数据库系统的著作,也是国内第一本系统讲解内存数据库TimesTen的专著。作者是拥有10余年Oracle从业经验的资深数据库架构师,本书的内容也得到了业界以盖国强为代表...
ORACLE数据库并发访问控制机制及访问冲突的解决方法.pdf
45. 在ORACLE7数据库并发控制技术的研究及其应用 46. 在SQLPlus中insert进的都是中文的,为什么一存入服务器后,再select出的就是???了 47. 在客户端处理Oracle的数据行加锁问题 48. 怎样查看init_ora文件 49. ...
查询ORACLE最大的并发数,在出现性能等问题时可以用到。
oracle数据库的并发控制
并发访问ORACLE数据库的数据死锁分析和解决措施.pdf
查看oracle数据库的连接数以及用户 1、查询oracle的连接数 2、查询oracle的并发连接数 3、查看不同用户的连接数 4、查看所有用户: 5、查看用户或角色系统权限(直接赋值给用户或角色的系统权限): 6、...
在1983年,Oracle发布了第二个版本,并加入了事务处理和并发控制功能,这使得它成为了业界首个支持完全事务处理的数据库引擎。 1985年,Oracle发布了第三个版本,引入了分布式数据库功能。这使得Oracle数据库成为了...
课程想以介绍了Oracle认证体系,详细带领同学们进行Oracle实战环境搭建,Oracle体系结构,Oracle数据库创建于安装,管理ASM实力实战,数据并发与控制,实施oracle数据库的审计,数据库的性能管理,备份恢复与数据库...
数据库管理系统(DataBase Managerment System,简称DBMS)是管理数据库的一个软件,它充当所有数据的知识库,并对它的存储、安全、一致性、并发操作、恢复和访问负责。是对数据库的一种完整和统一的管理和控制机制。...
民族古籍数字化保护系统中ORACLE数据库的并发控制研究.pdf
高并发Oracle数据库系统的架构与设计主要内容从三个维度展开:首先是内部扩展的维度,深入探讨了高效B树索引、高效表设计、查询优化器等数据库架构设计与优化的核心技术,以及高并发Oracle数据库系统架构与设计的...
12.6.5二进制压缩 12.7其他备份恢复技术 12.7.1用户管理备份 12.7.2导入导出工具数据泵 12.7.3跨平台数据迁移 12.7.4可传输表空间 12.7.5使用RMAN工具复制数据库 12.8本章小结 第13章 RAC恢复 13.1恢复技术...
oracle数据库闩锁锁定与并发专题
Oracle9i的数据库管理, Oracle9i数据库对象的管理,Oracle9i数据库的安全性,Oracle9i数据库的完整性和并发控制等
数据库设计 高并发 表、索引、分区设计与分析及解决方案 内存数据库timesten
本文内容 •软件环境 •简单演示 Oracle 数据库并发导致行级锁 本文简单演示针对表主键并发导致的行级锁。并发是两个以上的用户对同样的数据进行修改(包括插入、删除和修改)。锁的产生是因为并发。没有并发,就...
8.1 并发控制概述 8.2 封锁 8.3 封锁协议 8.4 活锁和死锁 8.5 并发调度的可串行性 8.6 两段锁协议 8.7 封锁的粒度 8.8 Oracle的并发控制 8.9 小结