Oracle简单总结

2018-02-09 12:39:08来源:oschina作者:GloriousH人点击

分享

分为oracle逻辑结构,和事务管理和锁的机制,至于pl/sql的语句什么函数过程触发器这些之类的,个人觉得用的很少,后期维护很打脑壳,就不记录了,知道有就行了!


首先上个图:


输入图片说明


个人的理解如下,有什么不对的,希望提出来哈!


oracle数据库主要由用户进程,服务进程,SGA(共享池,重做日志缓冲区,数据高速缓冲区),PGA等构成,sql的执行过程如图序号所示,用户建立连接后产生用户进程,发送sql请求后产生服务进程,并且开启PGA,然后请求进入共享池,分析执行计划,编译sql文件(下次一样的sql就不用再次分析了,提高性能),如果是DML语句则进入日志缓冲区,写入日志文件并且保存,以便于后续回滚(因为你无法控制高速数据缓冲区何时写入数据,万一回滚呢!日子缓冲区就这个作用)然后,进入数据高速缓冲区,在这里面进行数据的操作,然后数据高速缓冲区根据系统设定的机制自动将数据写入物理数据库并且保存(他什么时候写你无法控制,commit只是叫日志缓冲区写入变更文件到日志记录文件里)
参考:https://www.cnblogs.com/chengxiao/p/5904783.html


事务和锁:有了事务才会有锁,目的都是一样的,保证数据的一致性,事务通过隔离级别来保证,锁则通过S锁,X锁,RX,RSX锁,悲观锁,乐观锁,来保证


参考:https://www.cnblogs.com/lingyejun/p/7096791.html


说明

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


2.事务相关概念


  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) 死锁:当两个事务相互等待对方释放资源时,就会形成死锁,下面章节详细分析


事务隔离级别:


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(不允许不可重复读和脏读,只允许幻想读)


锁:


锁包括行级锁、表级锁、悲观锁、乐观锁
行级锁:一种它锁,防止另外事务修改此行;在使用以下语句时,Oracle会自动应用行级锁:INSERT、UPDATE、DELETE、SELECT … FOR UPDATE [OF columns] [WAIT n | NOWAIT];SELECT … FOR UPDATE语句允许用户一次锁定多条记录进行更新.使用commit或者rollback释放锁。 特点:开锁大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。适合于有大量按索引更新少量不同数据,同时又有并发查询的应用,如一些在线事务处理系统。
表级锁:5种
共享锁(SHARE) - 锁定表,对记录只读不写,多个用户可以同时在同一个表上应用此锁,在表没有被任何DML操作时,多个事务都可加锁,但只有在仅一个事务加锁的情况下只有此事务才能对表更新;当表已经被更新或者指定要更新时(select for update),任何事务都不能加此锁了。
共享行排他(SHARE ROW EXCLUSIVE) – 比共享锁更多的限制,禁止使用共享锁及更高的锁,在表没有被任何DML操作时,只有一个事务可以加锁,可以更新,书上说别的事务可以使用select for update锁定选中的数据行,可是实验后没被验证。
排他(EXCLUSIVE) – 限制最强的表锁,仅允许其他用户查询该表的行。禁止修改和锁定表
行共享 (ROW SHARE) – 禁止排他锁定表,与行排他类似,区别是别的事务还可以在此表上加任何排他锁。(除排他(exclusive)外)
行排他(ROW EXCLUSIVE) – 禁止使用排他锁和共享锁,其他事务依然可以并发地对相同数据表执行查询,插入,更新,删除操作,或对表内数据行加锁的操作,但不能有其他的排他锁(自身是可以的,没发现有什么用)


悲观锁:
Pessimistic Lock正如其名,它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守悲观态度,事务每次去操作数据的时候都假设有其他事务会修改需要访问的数据,所以在访问之前都要求上锁,行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁,因此,在整个数据处理过程中,将数据处于锁定状态。
一个典型的倚赖数据库的悲观锁调用: select * from account where name=”Erica” for update 这条sql 语句锁定了account 表中所有符合检索条件(name=”Erica”)的记录。 本次事务提交之前(事务提交时会释放事务过程中的锁),外界无法修改这些记录。


乐观锁:
Optimistic Lock,和悲欢锁相反,事务每次去操作数据之前,都假设其他事务不会修改这些需要访问的数据 ,所以 在访问之前不要求上锁,只是在进行更新修改操作的时候判断一下在访问的期间有没有其他人修改数据 了。它适用于多读的应用类型,冲突真的发生比较少的时候就比较好,这样省去了开销的开销,可以提高吞吐量;但如果是真的经常要发生冲突的,那每次还要去判断进行retry,反倒降低的性能,这个时候悲欢锁比较好。数据库如果提供类似于write_condition机制的其实都是提供的乐观锁。

最新文章

123

最新摄影

闪念基因

微信扫一扫

第七城市微信公众平台