锁的概念:锁是数据库用来控制共享资源并发访问的机制,锁用于保护正在被修改的数据,直到提交或回顾了事务之后,其他用户才可以更新数据。
模拟封锁问题
a. 用户1检索一行数据,并准备修改
b. 用户2检索到相同的一行数据
c. 用户2删除了这一行数据,并提交
d. 用户1修改那一行,并提交了,结果程序报错,该行不存在
处理方法:
select * from emp where empno=7900 for update;
加了for update就等于对emp这一行记录加了一个锁,其他用户不允许对这一行记录来做修改和删除。
锁定的优点
一致性:一次只允许一个用户来修改数据
完整性:为所有用户提供正确的数据。如果一个用户进行了修改并保存,锁做的修改将反映 给所有用户。
并行性:允许多个用户访问同一数据
锁的类型
行级锁
行级锁:对正在被修改的行进行锁定。其他用户可以访问除被锁定的行以外的行。
1、行级锁是一种排他锁,防止其他事务修改此行。
2、在使用以下语句时,Oracle会自动应用行级锁:insert、update、delete、select...for update
3、Select...for update语句运行用户一次锁定多条记录进行更新
4、使用commit或rollback语句释放锁
行级锁语句: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
1、Select * from tab for update(查询所有记录就等于查询整个表)
2、Lock table ttablename in row share mode;
RS不允许的操作
Lock table tablename in exclusive mode
行排他(row exclusive):禁止使用排他锁和共享锁。
RX(Row Exclusive Table Locks)
以下的操作会产生RS lock
1、insert、update、delete
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操作)。
S(Share 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):比共享锁更多的限制,禁止使用共享锁及更高的锁。
SRX(Share Row Exclusive Table Locks)
以下操作产生SRX LOCK
Lock table tablename in share row exclusive mode;
SRX不允许的操作
1、Lock table tablename in share mode;
2、Lock table tablename in share row exclusive mode;
3、Lock table tablename in row exclusive mode;
4、Lock table tablename in exclusive mode。
排他(exclusive):限制最强的表锁,仅允许其他用户查询该表的行。禁止修改和锁定表。是最高限制的锁。
X(Exclusive 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 update,lock row share
Select for update 当对话使用for update子串打开一个游标时,所有返回集中的数据行都将处于行级(Row-X)独占式锁定,其他对象只能查询,这些数据后不能进行update、delete或select for update操作。
3级锁:Row-X行独占(RX):用户行的修改,sub Exclusive
3级锁有Insert、update、delete、lock row exclusive
没有commit之前插入同样的一条记录会没有反应,因为后一个3的锁会一直等待上一个3的锁,我们必须释放掉上一个3才能继续工作。
4级锁:share共享锁(S),阻止其他DML操作,share
4级锁有create index、lock share
Lock_mode为2、3、4不印象DML(insert、delete、update、select)操作,但DDL(alter、drop等)操作会提示ora-00054错误。
5级锁:S/Row-X共享行独占(SRX),阻止其他事物操作,share/sub
Exclusive级锁有lock share row exclusive
具体来讲有主外键约束时update/delete...;可能会产生4、5的锁。
6级锁:exclusive独占(X),独占访问使用,exclusive
6级锁有Alter table、Drop table、Drop index、Truncate table、Lock 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自动全部回滚。
基本的事务处理:
在oracle中commit、rollback、savepoint这三条语句可以完成基本的事务管理功能
开始事务可以使用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)
Oracle中DDL语句对事务的影响
在oracle中,执行DDL语句(入create table,create view等)时,会在执行之前自动发出一个commit命令,并在随后发出一个commit或者rollback密码,也就是说,DDL会像如下伪码一样执行:
Commit;
DDL_Statement;
If(Error)then
Rollback;
Else
Commit;
End if;
事务实例3:(DDL语句对事物的影响)