【Oracle11g】07_锁
1.锁的概念
- 锁是数据库用来控制共享资源并发访问的机制。
- 锁用于保护正在被修改的数据。
- 直到提交或回滚了事务之后,其他用户才可以更新数据。
2.锁的类型
2.1 行级锁
行级锁是一种排他锁,防止其他事务修改此行。
在使用以下语句时,Oracle会自动应用行级锁:
INSERT
UPDATE
DELETE
SELECT … FOR UPDATE
SELECT … FOR UPDATE语句允许用户一次锁定多条记录进行更新
使用COMMIT或ROLLBACK语句释放锁
以下是模拟锁的案例:
打开2个cmd窗口,一个使用system用户登录,一个使用scott用户登录,登录后先在scott用户上修改表emp的数据
update emp set sal=100 where empno=7369;
在不提交与不回滚的状态下,继续在system用户下执行该语句。则结果如下:system窗口处于等待状态。
此时,我们可以查看锁
-- 使用sys用户登录,通过v$lock动态视图查到锁,然后找到锁对应的ID1列,找到对应的ID,例如:ID1列的值为73196
select * from v$lock;
-- 查看ID1值为73196的对象,通过表dba_objects可以看到表名,类型等信息
select * from dba_objects a where a.object_id='73196'
2.1.1 select ... for update语法
在给表使用select for update语句时,不允许删除和修改该表的记录,但是可以插入新的记录
语法:
SELECT … FOR UPDATE [OF columns] [WAIT n | NOWAIT];
wait n参数表示等待n秒后,能锁则锁,不能锁则返回错误信息
nowait参数表示不等待,我现在能锁则锁,不能锁则直接返回错误
2.2 表级锁
表级锁的意思就是将整个表都锁定,不允许其他用户对表访问。
使用命令显示地锁定表,应用表级锁的语法是:
LOCK TABLE table_name IN mode MODE;
- 行共享 (ROW SHARE) – 禁止排他锁定表
- 行排他(ROW EXCLUSIVE) – 禁止使用排他锁和共享锁
- 共享锁(SHARE)
- 锁定表,仅允许其他用户查询表中的行
- 禁止其他用户插入、更新和删除行
- 多个用户可以同时在同一个表上应用此锁
- 共享行排他(SHARE ROW EXCLUSIVE) – 比共享锁更多的限制,禁止使用共享锁及更高的锁
- 排他(EXCLUSIVE) – 限制最强的表锁,仅允许其他用户查询该表的行。禁止修改和锁定表
2.3 死锁
当两个事务相互等待对方释放资源时,就会形成死锁
Oracle会自动检测死锁,并通过结束其中的一个事务来解决死锁
作者:奔跑的金鱼
声明:书写博客不易,转载请注明出处,请支持原创,侵权将追究法律责任
个性签名:人的一切的痛苦,本质上都是对自己无能的愤怒
如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,博主在此感谢!