【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会自动检测死锁,并通过结束其中的一个事务来解决死锁

原文地址:https://www.cnblogs.com/OliverQin/p/12634807.html