暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

oracle事务和锁

知识共鸣 2019-03-24
347

一、介绍:一组SQL,一个逻辑工作单位,执行时整体修改或者整体回退

二、事务相关概念

(1)事务的提交和回滚:commit/rollback

(2)事务的开始和结束

开始事务:连接到数据库,执行DML,DCL,DDL语句

结束事务:

1、执行DDL(例如CREATE TABLE),DCL(例如GRANT),系统自动执行commit语句

2、执行commit/rollback

3、退出/断开数据库的连接自动执行commit语句

4、进程意外终止,事务自动rollback

5、事务commit时会生成一个唯一的系统变化号(SCN)保存到事务表

(3)保存点(savepoint):可以在事务的任何地方设置保存点,以便rollback

(4)事务的四个特性ACID:

1、Atomicity(原子性):事务中sql语句不可分割,那么都做,要么都不做

2、Consistency(一致性):指事务操作前后,数据库中数据是一致性的,数据满足业务规则约束(例如账户金额的转出和转入),与原子性对应。

3、Isolation(隔离性):多并发事务可以独立运行,而不能互相干扰,一个事务修改数据未提交前,其他事务看不到它所做的更改。

4、Durability(持久性):事务提交后,数据的修改是永久的。

(5)死锁:当两个事务相互等待对方释放资源时,就会形成死锁。

三、oracle事务隔离级别

1、两个事务并发访问数据库时可能存在的问题

(1)幻想读

事务T1读取一条指定where 条件的语句,返回结果集。此时事务T2插入一行新记录并commit,恰好满足T1的where 条件。然后T1使用相同的条件再次查询,结果集中可以看到T2插入的记录,这条新纪录就是幻想。

(2)不可重复读取

事务T1读取一行记录,紧接着事务T2修改了T1刚刚读取的记录并commit,然后T1再次查询,发现与第一次读取的记录不同,这称为不可重复读.

(3)脏读    

事务T1更新了一行记录,还未提交所做的修改,这个T2读取了更新后的数据,然后T1执行回滚操作,取消刚才的修改,所以T2所读取的行就无效,也就是脏数据。

2、oracle事务隔离级别

oracle支持的隔离级别:(不支持脏读)

read committed  --不允许脏读,允许幻想读和不可重复读

serializable      -- 以上三种都不允许

sql标准还支持read uncommitted(三种都允许)和repeatable read(不允许不可重复读和脏读,只允许幻想读)

四、事务相关语句

1、事务相关语句概括

set  transaction  ----设置事务属性

set  constraint   ----设置约束

savepoint        ----建立保存点

release savepoint  ----释放保存点

rollback          ----回滚

commit          ----提交



2、建立事务、隔离级别分析

(1)建立事务

set transaction read only  --事务中不能有任何修改数据库中数据的操作语句,这create,insert,update,delete语句

set transaction read write  --默认设置,该选项表示在事务中可以有访问语句,修改语句

set transaction isolation level read committed

set transaction isolation level serializable -- serializable可以执行DML操作

注意:这些语句是互斥的,不能够同时设置两个或者两个以上的选项

(2)read only

(3)read write



(4)isolation level read committed(可幻读和重复读)

1.建立两个事务如下:

事务一:


事务二、


结论:事务2的隔离级别为 isolation level read committed, 支持不可重复读

在事务1中插入一行数据,并提交:

在事务2中查看:

结论:事务2隔离级别为 isolation level read committed, 允许幻想读

(5)isolation level serialiazble

1.建立两个事务如下:
事务一、

事务二、

结论:事务2的隔离级别为 isolation level serializable, 不支持不可重复读



在事务1中插入一行数据,并提交:



在事务2中查看:

结论:事务2的隔离级别为 isolation level serializable, 不支持幻想读



五、oracle锁机制

1、概括

(1).说明:锁机制,多个事务同时访问一个数据库对象时,该机制可以实现对并发的控制

(2).oracle中锁的类别

1.DDL锁:oracle自动的施加和释放

2.DML锁:事务开始时施加,使用commit后者rollback被释放

3.内部锁:由oracle自己管理以保护内部数据库结构

(3).oracle锁的粒度

1.行级锁:阻止该行上的DML操作,直到commit或者rollback

2.数据库级锁:

将数据库锁定为只读模式 alter database open read only;

将数据库设置为限制模式(导入导出数据库时使用):alter system enable restricted session;

2、锁的模式

(1)命令

lock table student in row share mode;

lock table student in row exclusive mode;     --用于行的修改

lock table student in share mode;           --阻止其他DML操作

lock table student in share row exclusive mode; --阻止其他事务操作

lock table student in exclusive mode;         --独立访问使用

(2)锁查看

select * from V$SESSION;--查看会话和锁的信息

select * from V$SESSION_WAIT;--查看等待的会话信息

select * from V$LOCK;--系统中所有锁

select * from V$LOCKED_OBJECT;--系统中DML锁



六、死锁

1、说明

(1).当两个用户希望持有对方的资源时就会发生死锁。即两个用户互相等待对方释放资源,oracle认定为产生了死锁,在这种情况下,将以牺牲一个用户作为代价,另一个用户继续执行,牺牲的用户的事务将回滚。

(2).lORA-00060的错误并记录在数据库的日志文件alertSID.log中。同时在user_dump_dest下产生了一个跟踪文件,详细描述死锁的相关信息。 



2、死锁产生条件

(1)Mutual exclusion(互斥):资源不能被共享,只能由一个进程使用。

(2)Hold and wait(请求并保持):已经得到资源的进程可以再次申请新的资源。

(3)No pre-emption(不可剥夺):已经分配的资源不能从相应的进程中被强制地剥夺。

(4)Circular wait(循环等待条件):系统中若干进程组成环路,该环路中每个进程都在等待相邻进程正占用的资源。



3、解决死锁冲突

(1)执行commit或者rollback结束事务

(2)终止会话



4、事务和死锁预防总结

(1)避免应用不运行长事务。

(2)经常提交以避免长时间锁定行。

(3)避免使用LOCK命令锁定表。

(4)在非高峰期间执行DDL操作,在非高峰期间执行长时间运行的查询或事务。

另外需注意,需监测系统中死锁,调查为什么这些锁正被保持,频率;当死锁发生通过回滚事务rollback或者终止会话来解决它。

个人整理出来的Oracle事务和锁,供大家参考和学习。

文章转载自知识共鸣,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论