oracle中的锁——共享资源并发访问的机制

###1、锁的概念

所用于保护正在被修改的数据,直到用户A提交了或回滚了事务以后,其他用户才可以对表上的数据进行修改或更新,但是其他用户可以对该数据进行select访问。
oracle中的锁——共享资源并发访问的机制_第1张图片

2、锁的优点

  • 一致性 - 一次只允许一个用户修改数据
  • 完整性 - 为所有用户提供正确的数据。如果一个用户进行了修改并保存,所做的修改将反映给所有用户
  • 并行性 -允许多个用户访问同一数据

3、锁的类型

####(1)行级锁 TX

  • 对正在被修改的行进行锁定。其他用户可以访问和修改除被锁定的行以外的行。
  • 行级锁是一种排他锁,也就是一次只能为该行上一个锁,防止其他事务修改此行。具有排他性。
  • 在执行insert update delete select…for update时 oracle会自动为其增加行级锁(表级锁)。
  • 解锁 : commit; 或者 rollback;
  • 可以通过system下查询视图 select * from v$lock; 来查看oracle中的锁。

select for update
           单单select是不会为其对应操作的表/行进行加锁,但用户想要加锁,就可以在select执行语句后加上 for update 就会实现加锁操作。注意,当使用select…for update锁定某张表时,其他用户不可以再进行删除或修改操作,但是可以进行插入操作。(SELECT … FOR UPDATE语句允许用户一次锁定多条记录进行更新)

  • 当用户B想要修改的某一行已经被用户A加上了锁,那么用户B只能进入等待状态,直到用户A完成修改(commit / rollback)才能执行用户B想要执行的操作。
  • 为了避免用户B无限制的等待下去,有两种解决办法
    ①用户B在执行 select…for update wait 时间(s) 就可以设定自己想要等待的时间,按秒计算。
    select * from student where sno=‘1121’ for update wait 5;
    ② 并不想等待 nowait
    select * from student where sno=‘1121’ for update nowait ;

####(2)表级锁 TM

表级锁的锁定语法:lock table table_name in 类型 mode
分别有以下几种类型:
①行共享 (ROW SHARE) –只禁止排他EXCLUSIVE锁定表,但是其他用户可以访问并进行修改操作(更新删除插入)

 `lock table student in row share mode` 

②行排他(ROW EXCLUSIVE) – 禁止使用排他锁和共享锁

lock table student in row exclusive mode

③共享锁(SHARE) 锁定表,仅允许其他用户查询表中的行,禁止其他用户插入、更新和删除行,多个用户可以同时在同一个表上应用此锁。

 `lock table student in share mode` 

            等同于 select for update一样,锁定了其他用户只能对该表进行查询操作,但不一样的是,share锁多个用户可以同时在同一个表上应用此锁。

④共享行排他(SHARE ROW EXCLUSIVE) – 比共享锁更多的限制,禁止使用共享锁及更高的锁 (排他)

 `lock table student in share row exclusive mode` 

⑤排他(EXCLUSIVE) – 限制最强的表锁,仅允许其他用户查询该表的行。禁止修改和锁定表。

###四、死锁

  • 当两个事务相互等待对方释放资源时,就会形成死锁
  • Oracle会自动检测死锁,并通过结束其中的一个事务来解决死锁
    oracle中的锁——共享资源并发访问的机制_第2张图片

你可能感兴趣的:(oracle)