本课内容属于Oracle高级课程范畴,内容略微偏向理论性,可是与数据库程序开发和管理、优化密切相关;另外本课的部份内容在前面章节已经涉及,请注意理论联系实际。 html
事务 数据库
事务(Transaction)从 通信的角度看:是用户定义的数据库操做序列,这些操做要么全作、要么全不作,是不可分割的一个工做单元。事务控制语句称为TCL,通常包括Commit和Rollback。 缓存
事务不是程序,事务和程序分属两个概念。在RDBMS中,一个事务能够有一条SQL语句、一组SQL语句或者整个程序;一个应用程序又一般包含多个事务。 服务器
事务是恢复和并发控制的基本单元。 数据结构
显式事务和隐式事务 并发
begin 数据库设计
insert into classes_2(bjbh,bjmc,bjms,bzr,ssxb,bjrs,bz) 性能
values ('888','测试班级','测试班级','肖丰斌','003','38',''); 测试
commit/rollback; 大数据
end ;
insert into classes_2(bjbh,bjmc,bjms,bzr,ssxb,bjrs,bz)
values ('888','测试班级','测试班级','肖丰斌','003','38','');
commit/rollback;
事务的ACID特性和结束方式
事务的ACID特性和结束方式
破坏事务ACID特性的因素包括:
1.多个事务并行运行时,不一样事务的操做交叉执行
2.事务在运行过程当中被强行终止
事务的结束方式包括:
并行性和一致性
并行性和一致性是针对多用户、多事务,而非单用户、单事务数据库环境的,其含义是在多用户、多事务环境下,针对同一张数据库表的数据存在同时更新(含Update和Insert、Delete)的状况。
并行性意味着多用户可以同时访问数据;
一致性意味着每一个用户看到的数据是一致的。
为保证数据的一致性,通常采用了事务隔离机制(事务隔离模型),又称为事务串行化,用来保证事务尽可能按照串行的方式执行。
执行并行事务要防止三种状况:
1.脏读:事务读取了另一个没有提交的事务的数据(脏数据);
2.非重复读:事务从新读取了之前读取的数据,结果发现另一个已经提交的事务已经修改了那些数据;
3. 幻影读:一个事务从新执行,返回知足条件的行集数据,结果发现另一个已经提交的事务插入了知足条件的其余行的数据。
隔离层 |
未提交的读模式 |
提交的读模式 |
重复读模式 |
串行化模式 |
脏读 |
可能 |
不可能 |
不可能 |
不可能 |
非重复读 |
可能 |
可能 |
不可能 |
不可能 |
幻影读 |
可能 |
可能 |
可能 |
不可能 |
并行性适用的状况
前提条件是必须是多CPU的服务器上执行,此时并行性的好处才能显示出来,单CPU服务器上实验并行性反而会下降性能。
•处理对大表(至少100万行记录以上)的大数据量查询
•处理链接很是大的表查询
•处理创建大索引、大容量数据装载、汇总计算
•处理Oracle对象间大量数据拷贝等做业
•处理在SMP(对称多处理器)或MPP(大规模并行处理)群和聚合(多机器同时访问同一组磁盘和主数据库)的机器上的查询
•处理存放在分布于不一样磁盘的多个数据文件中的数据查询
•处理须要大量辅助内存的查询,如Group by、Order By等
语句级读一致性和事务级读一致性
Oracle锁
什么是数据库锁
锁是用于防止在访问相同的资源(包括用户对象、系统对象、内存、Oralce数据字典中的共享数据结构,最多见的是数据库表Table对象)时 ,事务之间的有害性 交互(存、取)的一种机制。
不一样类型的锁,表明了当前用户是容许仍是阻止其它用户对相同资源的同时存取,从而确保不破坏系统数据的完整性、一致性和并行性。
加锁是实现数据库并发控制的一个很是重要的技术。当事务在对某个数据对象进行操做前,先向系统发出请求,对其加锁。加锁后事务就对该数据对象有了必定的控制,在该事务释放锁以前,其余的事务不能对此数据对象进行更新操做。
两种锁机制
共享锁(Share Lock):即S锁,是经过对数据存取的高并行性来实现的。加了共享锁的数据库对象能够被其它事务读取,可是不能被其它事务修改。
独占锁(Exclusive Lock):即X锁,又称排它锁,是用来防止同时共享相同资源的锁。加了独占锁的数据库对象不能被其它事务读取和修改。
•锁在事务保持期间是被保持的,用来防止包括脏读、丢失更新和破坏性DLL等交互行为。对一个事务中SQL语句所作的修改只有在该事务提交或回滚后才能被其它事务所使用。
•Commit或Rollback执行后,事务所使用的锁被释放。
死锁
锁的类型
1.数据锁(DML锁)。
用来保证并行访问数据的完整性。可以防止同步冲突的DML和DDL操做的破坏性 交互。是Oracle中主要的锁,又包括表级锁(TM锁)和行级锁(TX锁、也称为事务锁)。
(1).TM锁
1.数据锁(DML锁) 。
(2).TX锁及DML锁工做机制
TX锁是Transaction eXclusive Lock行级排它锁,对一条记录加上TX锁后,其余用户不能修改、删除该记录。
•当Oracle 执行DML语句时,系统自动在所要操做的表上申请TM类型的锁。当TM锁得到后,系统再自动申请TX类型的锁,并将实际锁定的数据行的锁标志位进行置位。 这样在事务加锁前检查TX锁相容性时就不用再逐行检查锁标志,而只需检查TM锁模式的相容性便可,大大提升了系统的效率。TM锁包括了SS、SX、S、X 等多种模式,在数据库中用0-6来表示。不一样的SQL操做产生不一样类型的TM锁。
1.数据锁(DML锁)
(2).TX锁及DML锁工做机制
•在数据行上只有X锁(排他锁)。在 Oracle数据库中,当一个事务首次发起一个DML语句时就得到一个TX锁,该锁保持到事务被提交或回滚。当两个或多个会话在表的同一条记录上执行 DML语句时,第一个会话在该条记录上加锁,其余的会话处于等待状态。当第一个会话提交后,TX锁被释放,其余会话才能够加锁。
•当Oracle数据库发生TX锁等待时,若是不及时处理经常会引发Oracle数据库挂起,或致使死锁的发生,产生ORA-60的错误。这些现象都会对实际应用产生极大的危害,如长时间未响应、大量事务失败等。
2.字典锁(DDL锁)
当 DDL命令发出时,Oracle会自动在被处理的对象上添加DDL锁定,从而防止对象被其余用户所修改。当DDL命令结束之后,则释放DDL锁定。DDL锁定不能显式的被请求,只有当对象结构被修改或者被引用时,才会在对象上添加DDL锁定。好比建立或者编译 存储过程时会对引用的对象添加DDL锁定。在建立视图时,也会对引用的表添加DDL锁定等。
在执行DDL命令以前,Oracle会自动添加一个隐式提交命令,而后执行具体的DDL命令,在DDL命令执行结束以后,还会自动添加一个隐式提交命令。实际上,Oracle在执行DDL命令时,都会将其转换为对数据字典表的DML操做。好比咱们发出建立表的DDL命令时,Oracle会将表的名称插入数据字典表tab$里,同 时将表里的列名以及列的类型插入col$表里等。所以,在DDL命令中须要添加隐式的提交命令,从而提交那些对数据字典表的DML操做。即便DDL命令失 败,它也会发出提交命令。DDL锁包括三种类型:
•排他的DDL锁定(Exclusive DDL Lock)
大部分的DDL操做都会在被操做的对象上添加排他的DDL锁定,从而防止在DDL命令执行期间,对象被其余用户所修改。当对象上添加了排他的DDL锁定之后,该对象上不能再添加任何其余的DDL锁定。若是是对表进行DDL命令,则其余进程也不能修改表里的数据。
2.字典锁(DDL锁)
•共享的DDL锁定(Shared DDL Lock )
用来保护被DDL的对象不被其余用户进程所更新,可是容许其余进程在对象上添加共享的DDL锁定。若是是对表进行DDL命令,则其余进程能够同时修改表里 的数据。好比咱们发出create view命令建立视图时,在视图的所引用的表(这种表也叫基表)上添加的就是共享的DDL命令。也就是说,在建立视图时,其余用户不能修改 基表的结构,但 是能够更新基表里的数据。
3.内部锁
内部锁保护内部数据库结构,如数据文件,对用户是不可见的。
2.字典锁(DDL锁)
•可打破的解析锁定(Breakable Parsed Lock)
在shared pool里缓存的SQL游标或者PL/SQL程序代码都会得到引用对象上的解析锁定。若是咱们发出DDL命令修改了某个对象的结构时,该对象相关的、位于 shared pool里的解析锁定就被打破,从而致使引用了该对象的SQL游标或者PL/SQL程序代码全都失效。下次再次执行相同的SQL语句时,须要从新解析,这 也就是所谓的SQL语句的reload了。可打破的解析锁定不会阻止其余的DDL锁定,若是发生与解析锁定相冲突的DDL锁定,则解析锁定也会被打破
死锁的解决
1.查找锁
3.Kill 操做系统进程
Orakill 实例名 操做系统进程ID
Orakill oralearn 2444
其中oralearn是数据库sid,244是第二步查出spid
数据完整性
经常使用的数据完整性约束规则包括:
1.NOT NULL
2.惟一关键字
3.主关键字
4.外键
5.检查项Check
因为本部份内容再前面的章节中已经穿插讲解,本处再也不赘述
要点及习题
习题
1.什么是事务,请解释什么是显式事务和隐式事务。
2.事务具备哪四个特性?并行性 事务主要使用的状况是什么,请举出四种状况。
3.事务级读一致性包括那三种类型,并列表说明其相同点和不一样点。
4.什么是数据库锁,包括那两种大的类型?TM锁又包括那些类型?
5.将表级锁和行级锁结合起来,举例解释数据锁的工做机制。
6.什么是死锁?死锁解决的步骤是什么?
7.为何数据库设计不推荐大量使用外键来确保数据完整性?