网站首页 > 技术文章 正文
3.锁
在事务并发时已经提到了锁的概念,锁是为了保证数据的并发性、完整性和一致性而引入的一种机制。前面事务中已经认识了共享锁和排他锁是按照并发事务对资源访问级别划分的。按照锁定的不同对象划分,又分为行级锁和表级锁。
> 行级锁:只对用户正在访问的行进行锁定。
> 表级锁:对整个表进行锁定。
Oracle 中实现加锁机制主要有两种方式: 自动加锁和人工加锁。
自动加锁:
在一般情况下,oracle 会根据要求获得资源的同时,自动的使用不同类型的锁来控制数据的并行存取,以防止用户之间的破坏性干扰。默认情况下,更新数据时 oracle会自动提供排他锁,使不同用户更新表中同一记录时不会发生冲突。
用户在执行INSERT、UPDATE、DELETE、DCL 语句、DDLig句时,Oracle 系统会自动加锁。在一个事务中,系统会自动锁定某一个数据库对象,只有该事务提交或者回滚后,系统释放资源,其他用户才能使用该资源。
例如: 不同用户对EMP 表进行更新操作,第一个用户update 后,第二个用户也进行更新操作,在第一个用户没有提文或者回滚事务时,第二个用户的操作将一直无法正常运行。
征服平凡、挑战自我,我们期待你的加入!兆隆IT云学院,0学费,0基础,等你来!
使用:SELECT …FOR UPDATE OF 列 [WAIT n 丨NOWAIT] 查询时也可以自动锁定查询的行。只是更新时如果行中有锁。那么就会等待,可以使用WAIT或NOWAIT 选择等待的时间或者不等待。
比如;在emp 表中正在修改的情况下运行下面语句。查询时如果资源被锁定,那么等待3 秒钟之后,资源仍然被锁定则自动放弃该操作。
代码演示:SELECT…FOR UPDATE
SQL> SELECT * FROM EMP FOR UPDATE WAIT 3;
SELECT * FROM EMP FOR UPDATE WAIT 3
ORA-30006:资源已被占用;执行操作时出现WAIT 超时
当事务获得行级锁后,此事务也将自动获得表级共享锁,这时其他用户不能执行DML语句对该表进行操作,只能查询表中的数据。
人工加锁
除了系统自动加锁外,在数据库的管理中,也可以人工强制对表加锁。使用命令是:
LOCK TABLE 表名IN 锁类型 MODE[NOWAIT]
NOWAIT 为了防止无限等待其他用户释放锁。
主动如锁的锁类型有: 行共享锁(ROW SHARE),行排他锁(ROW EXCLUSIVE),共享更新(SHARE UPDATE), 共享锁 (SHARE),共享排他锁 (SHARE EXCLUSIVE), 排他锁 (EXCLUSIVE)。
代码演示:手工加锁:排他锁定EMP 表
SQL> LOCK TABLE EMP IN EXCLUSIVE MODE NOWAIT;
Table(s) lorked
提示:在Oracle实际开发中,一般不需要对Oracle的进行特殊处理,都是系统自动完成的。手工加锁一般都是数据管理库管理员为了数据库管理而加的锁。
征服平凡、挑战自我,我们期待你的加入!分享来自兆隆IT云学院,QQ:598756835
猜你喜欢
- 2024-11-14 深入浅出MySQL之MySQL锁概述 mysql锁的实现原理
- 2024-11-14 面试必问的Mysql事务和锁,你真的了解吗?
- 2024-11-14 数据库常用的锁有哪些? 数据库锁种类
- 2024-11-14 MySQL事务和锁的使用 mysql事务锁机制
- 2024-11-14 数据库融入DevOps基因后,运维再也不用做背锅侠了
- 2024-11-14 Mysql锁-01锁相关的一些概念 mysql锁的实现原理
- 2024-11-14 SQL锁是数据库管理系统中用来管理并发访问的一种机制
- 2024-11-14 干货总结:彻底搞懂MySQL数据库锁机制(上篇)
- 2024-11-14 「每天一道面试题」MySQL锁 mysql锁使用
- 2024-11-14 Mysql锁的内部实现机制浅析 mysql锁的种类
你 发表评论:
欢迎- 613℃几个Oracle空值处理函数 oracle处理null值的函数
- 604℃Oracle分析函数之Lag和Lead()使用
- 593℃0497-如何将Kerberos的CDH6.1从Oracle JDK 1.8迁移至OpenJDK 1.8
- 590℃Oracle数据库的单、多行函数 oracle执行多个sql语句
- 584℃Oracle 12c PDB迁移(一) oracle迁移到oceanbase
- 578℃【数据统计分析】详解Oracle分组函数之CUBE
- 567℃最佳实践 | 提效 47 倍,制造业生产 Oracle 迁移替换
- 559℃Oracle有哪些常见的函数? oracle中常用的函数
- 最近发表
-
- PageHelper - 最方便的 MyBatis 分页插件
- 面试二:pagehelper是怎么实现分页的,
- MyBatis如何实现分页查询?(mybatis-plus分页查询)
- SpringBoot 各种分页查询方式详解(全网最全)
- 如何在Linux上运行exe文件,怎么用linux运行windows软件
- 快速了解hive(快速了解美国50个州)
- Python 中的 pyodbc 库(pydbclib)
- Linux搭建Weblogic集群(linux weblogic部署项目步骤)
- 「DM专栏」DMDSC共享集群之部署(一)——共享存储配置
- 故障分析 | MySQL 派生表优化(mysql pipe)
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端缓存 (63)
- 前端aes加密 (58)
- 前端脚手架 (56)
- 前端md5加密 (54)
- 前端路由 (61)
- 前端数组 (73)
- 前端js面试题 (50)
- 前端定时器 (59)
- 前端获取当前时间 (50)
- Oracle RAC (76)
- oracle恢复 (77)
- oracle 删除表 (52)
- oracle 用户名 (80)
- oracle 工具 (55)
- oracle 内存 (55)
- oracle 导出表 (62)
- oracle约束 (54)
- oracle 中文 (51)
- oracle链接 (54)
- oracle的函数 (58)
- 前端调试 (52)
本文暂时没有评论,来添加一个吧(●'◡'●)