锁及事务的高级使用

锁的概念:锁是数据库用来控制共享资源并发访问的机制,锁用于保护正在被修改的数据,直到提交或回顾了事务之后,其他用户才可以更新数据。

模拟封锁问题

a. 用户1检索一行数据,并准备修改

b. 用户2检索到相同的一行数据

c. 用户2删除了这一行数据,并提交

d. 用户1修改那一行,并提交了,结果程序报错,该行不存在

处理方法:

select * from emp where empno=7900 for update;

加了for update就等于对emp这一行记录加了一个锁,其他用户不允许对这一行记录来做修改和删除。

锁定的优点

一致性:一次只允许一个用户来修改数据

完整性:为所有用户提供正确的数据。如果一个用户进行了修改并保存,锁做的修改将反映 给所有用户。

并行性:允许多个用户访问同一数据

锁的类型

 

行级锁

行级锁:对正在被修改的行进行锁定。其他用户可以访问除被锁定的行以外的行。

1、行级锁是一种排他锁,防止其他事务修改此行。

2、在使用以下语句时,Oracle会自动应用行级锁:insertupdatedeleteselect...for update

3Select...for update语句运行用户一次锁定多条记录进行更新

4、使用commitrollback语句释放锁

行级锁语句:select...for update [of columns] [wait n|nowait];

说明:of字句用于指定即将更新的列,即锁定行上的特性列。Wait字句指定等待其他用户释放锁的秒数,防止无限期的等待。

行级锁实例1

Select * from order_master where vencode=’V002’ for update of odate,del_date;--锁定两列

Update order_master set del_data=’28-08-05’ where vencode=’V002’;

Commit;

Select * from order_master where vencode=’V002’ for update wait 5;--如果该行已经有其他用户要对它进行更新,则等待5秒用户还没有更新完,就报错

Select * from order_master where vencode=’V002’ for update nowait;--如果该行已经有其他用户要对它进行更新,不等待直接报错

使用for update wait 字句的有点如下:

1、防止无限期地等待被锁定的行;

2、允许应用程序中对锁的等待时间进行更多的控制;

3、对于交互式应用程序非常有用,因为这些用户不能等待不确定;

4、若使用了skip locked,则可以越过锁定的行,不会报告有wait n 引发的“资源忙”异常报告。

表级锁

表级锁:锁定整个表,限制其他用户对表的访问。当一个事物在进行DML操作时,所在的事务会对所操作的表加表级锁,以保证在这个事务过程中表不会被改变。

使用命令显示地锁定表,应用表级锁的语法是:

Lock table table_name in mode MODE;

 

 表级锁的类型:

行共享(row share禁止其他用在在这个表使用排他锁。

行共享在以下的操作会产生RS lock

1Select * from tab for update(查询所有记录就等于查询整个表)

2Lock table ttablename in row share mode;

RS不允许的操作

Lock table tablename in exclusive mode

行排他(row exclusive禁止使用排他锁和共享锁。

RXRow Exclusive Table Locks

以下的操作会产生RS lock

1、insertupdatedelete

2、Lock table tablename in row exclusive mode;

RX不允许的操作

1、Lock table tablename in share mode

2、Lock table tablename in share exclusive mode

3、Lock table tablename in exclusive mode

共享锁(share):锁定表,仅允许其他用户查询表中的行;禁止其他用户插入、更新和删除行;多个用户可以同时在同一个表上应用此锁(但是都不能进行DML操作)。

SShare Table Locks

以下操作产生S lock

Lock Table tablename in share mode

S不允许的操作

1、Lock Table tablename in share row exclusive mode 

2、Lock table tablename in exclusive mode

3、Lock table tablename in row exclusive mode

共享行排他(share row exclusive):比共享锁更多的限制,禁止使用共享锁及更高的锁。

SRXShare Row Exclusive Table Locks

以下操作产生SRX LOCK

Lock table tablename in share row exclusive mode

SRX不允许的操作
1Lock table tablename in share mode

2Lock table tablename in share row exclusive mode

3Lock table tablename in row exclusive mode

4Lock table tablename in exclusive mode

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

XExclusive Table Locks

以下操作产生X Lock

Lock Table tablename in Exclusive mode

X不允许的操作

除了查询不允许所有的操作

ORACLE里锁有以下几种模式:

0级锁:none

1级锁:null 

Select,有时会在v$locked_object出现

2级锁:Row-S行共享(RS);共享表锁,sub share

2级锁有select for update lock for updatelock row share

Select for update 当对话使用for update子串打开一个游标时,所有返回集中的数据行都将处于行级(Row-X)独占式锁定,其他对象只能查询,这些数据后不能进行updatedeleteselect for update操作。

3级锁:Row-X行独占(RX):用户行的修改,sub Exclusive

3级锁有Insertupdatedeletelock row exclusive

没有commit之前插入同样的一条记录会没有反应,因为后一个3的锁会一直等待上一个3的锁,我们必须释放掉上一个3才能继续工作。

4级锁:share共享锁(S),阻止其他DML操作,share

4级锁有create indexlock share

Lock_mode234不印象DMLinsertdeleteupdateselect)操作,但DDLalterdrop等)操作会提示ora-00054错误。

5级锁:S/Row-X共享行独占(SRX),阻止其他事物操作,share/sub

Exclusive级锁有lock share row exclusive

具体来讲有主外键约束时update/delete...;可能会产生45的锁。

6级锁:exclusive独占(X),独占访问使用,exclusive

6级锁有Alter tableDrop tableDrop indexTruncate tableLock Exclusive

死锁

当两个事务相互等待对方释放资源时,会形成死锁

Oracle会自动检测死锁,并通过结束其中的一个事务来解决死锁

锁实例2:(死锁)

1、用户1对表A进行update,没有提交

 

2、用户2对表B进行update,没有提交

 

3、如果用户2此时对A表做update,则会发生阻塞锁现象

 

没有反应,发生阻塞锁现象

4、如果用户1此时对B表做update,则会产生死锁现象

用户1等待一段时间

 

用户2出现

 

事务

事务简介

事务:就是一个完整的逻辑工作单元,由多个操作组成,所以操作要买全部成功,要么全部失败。

事务特点:原子性(银行转账),一致性(银行转账总金额),隔离性(一个事务在操作,另一个事务不能操作),持久性(数据永久保存)简称ACID

数据库事务:由多个SQL语句组成的一个逻辑工作单元,所以有SQL都必须同时执行成功,只要其中一个执行失败,则所有执行过的SQL自动全部回滚。

基本的事务处理:

oraclecommitrollbacksavepoint这三条语句可以完成基本的事务管理功能

开始事务可以使用transation.begintransation或执行第一个sql事务开始

事务控制语言:

事务是最小的工作单元,作为一个整体进行工作

保证事务的整体成功或失败,称为事务控制

用户事务控制的语句有

1、commit-提交并结束事务处理

2、Rollback-撤销事务中已完成的工作

3、Savepoint-标记事务中可以回滚的点

 事务实例1


COMMIT语句

当向数据库发出commit语句,那该事物就被被总结了,并且:

1、事务完成了所有工作永久化;

2、其他事务可以看到此事务所作的修改;

3、事务所需要执行的所有加锁(lock)处理被释放。

Rollback语句

当想数据库发出rokkback语句,那该事物就被终结了,并且:

1、事务完成的所有工作被取消(undo);

2、事务所需要执行的所有加锁(lock)处理被释放。

Savepoint语句

Rollback会撤销整个事务,使用savepoint可以做到部分撤销事务。

事务实例2:(在一个完整的事务中使用savepoint

 

OracleDDL语句对事务的影响

oracle中,执行DDL语句(入create tablecreate view等)时,会在执行之前自动发出一个commit命令,并在随后发出一个commit或者rollback密码,也就是说,DDL会像如下伪码一样执行:

Commit;

DDL_Statement;

If(Error)then

Rollback;

Else

Commit;

End if;

事务实例3:(DDL语句对事物的影响)

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章