• 1. 数据库的视图、事务、并发和锁
  • 2. 数据库的视图、事务、并发和锁1.视图 2.事务 3.并发 4.锁
  • 3. 一.视图视图也是一种数据库对象,英文叫做“view”,是基于一个表或多个表或视图的逻辑表。 a)      视图是一种虚表 b)      视图建立在已有表基础上,视图依赖 已建立的这些表称为基表 c)        向视图提供数据内容的语句为SELECT语句,可以将视图理解为存储起来的SElECT语句 d)         视图向用户提供基表数据的另一种表示形式
  • 4. 视图的优点: 1、数据访问控制。注意视图也是一个数据库对象。如果限制用户只能通过视图访问数据,那么就可能限制用户访问指定的数据,而不是数据库中的原始数据。 2、简单复杂SQL的调用。有些一条SQL可能有好多行,通常都是一些报表。直接在JAVA或C程序调用并不方便,此时就可以创建一个视图,然后就用一句简单的“select * from 视图名”就可以了。 3、实现相同查询语句的复用。
  • 5. 创建视图(1)create or replace view 视图名 as select语句。(“create or replace”表示的意思是同名的视图没有则创建,有则替换。) 例如:create  view namepoint  as select name,point from student (2)很多时候,我们创建视图只为了看方便,不需要或者不希望修改,那么我们就创建一个只读的视图。 create or replace view namepoint  as select name,point from   student  with read only (3)视图的数据源可以来自一个表,也可以来自多个表。 create or replace view namepoint as select s.name,s.point,c.coursename,c.courseteacher  from student s,course c with read only (4)drop view  namepoint; (删除视图)
  • 6. 视图分类视图的分类: 视图分为简单视图和复杂视图 1.简单视图只从单表里获取数据,复杂视图从多表获取数据;  2.简单视图不包含函数和数据组,复杂视图包含;  3.简单视图可以实现DML操作,复杂视图不可以。 。 
  • 7. Oracle事务、并发、锁
  • 8. 事务(1)事务:也称工作单元,是一个或多个SQL语句组成的 序列,这些个SQL操作作为一个完整的工作单元,要么全部执行要么全不执行。 Atomic(原子性):事务中包含的操作被看做一个逻辑单元,这个逻辑单元中的操作要 么全部成功,要么全部失败。   Consistency(一致性):事务中包含的操作从一个一致的状态到另一个一致的状态, Isolation(隔离性):  事务允许多个用户对同一个数据进行并发访问,而不破坏数据的正  确性和完整性。同时,并行事务的修改必须与其他并行事务的修改  相互独立。 (事务的执行是互不干扰的,一个事务不可能看到其他事务运行时,中间某一时刻的数据。) Durability(持久性):一旦提交,对数据的修改是永久的。 commit/rollback
  • 9. 几个重要命令演示:Commit Rollback Savepoint
  • 10. 事务的隔离级别数据库事务的隔离级别有4个,由低到高依次为Read uncommitted、Read committed、Repeatable read、Serializable,这四个级别可以逐个解决脏读、不可重复读、幻读这几类问题。
  • 11. 脏读(dirty read):当一个事务读取另一个事务尚未提交的修改时,产生脏读。(oracle中无此现象) (2) 不可重复读(nonrepeatable read):同一查询在同一事务中多次进行,由于其他提交事务所做的修改和删除,每次返回不同的结果集,此时发生不可重复读。 例如: Insert into emp(empno,ename) values(9000, '李明') Sqlplus 2: select * from emp; Sqlplus 1: delete from emp where empno=9000 Commit Sqlplus 2: select * from emp; --两次查询的记录不同 (3) 幻读(phantom read):同一查询在同一事务中多次进行,由于其他提交事务所做的插入操作,每次返回不同的结果集,此时发生幻读。 例如: Sqlplus 2: select * from emp; Sqlplus 1: Insert into emp(empno, ename)values(9999, '李亮'); Commit; Sqlplus 2: select * from emp; --两次查询的记录不同
  • 12. 锁锁的类型:在数据库中有两种基本的锁类型:排它锁(Exclusive Locks,即X锁)和共享锁(Share Locks,即S锁)。当数据对象被加上排它锁时,其他的事务不能对它读取和修改;加了共享锁的数据对象可以被其他事务读取,但不能修改。  Oracle重要的锁:在Oracle中最主要的锁是DML(也可称为data locks,数据锁)锁。DML锁的目的在于保证并发情况下的数据完整性。在Oracle数据库中,DML锁主要包括TM锁和TX锁,其中TM锁称为表级锁,TX锁称为事务锁或行级锁。
  • 13. 如何用锁 1.共享锁一般用于表级,排他锁一般用于行级。  2.比如一个DML操作,就要对受影响的行加排他锁,也就是说别的会话不能修改这些行。同时为了避免在做这个DML操作的时候,有别的会话执行DDL,修改表的定义,所以要在表上加共享锁,这样就阻止了DDL的操作。  4.当执行DDL操作时,就需要在全表上加排他锁
  • 14. 死锁 ORACLE死锁的问题 死锁产生的原因 两个事务更新同一个表,并且同时每个事务要更新的数据正在被另外一个事务所锁定。因为两个事务在相互等待资,两个事务都无法继续下去直到ORACLE产生一个DEADLOCK的错误。 
  • 15. 乐观锁和悲观锁悲观锁: select * from account where name=”Erica” for update 这条 sql 语句锁定了 account 表中所有符合检索条件( name=”Erica” )的记录。  本次事务提交之前(事务提交时会释放事务过程中的锁),外界无法修改这些记录。 从上可知悲观锁事实是一个行级排它锁 
  • 16. 相对悲观锁而言,乐观锁机制采取了更加宽松的加锁机制。悲观锁大多数情况下依 靠数据库的锁机制实现,以保证操作最大程度的独占性。但随之而来的就是数据库 性能的大量开销,特别是对长事务而言,这样的开销往往无法承受。乐观锁机制在一定程度上解决了这个问题 一个长事务导致其他事务无法操作表、记录(并发能力低) 乐观锁,大多是基于数据版本 ( Version )记录机制实现。何谓数据版本?即为数据增加一个版本标识,在基于 数据库表的版本解决方案中,一般是通过为数据库表增加一个 “version” 字段来 实现。 
  • 17. 乐观锁实现例子  操作员 A 此时将其读出( version=1 ),并从其帐户余额中扣除 $50 ( $100-$50 )。  2 在操作员 A 操作的过程中,操作员 B 也读入此用户信息( version=1 ),并  从其帐户余额中扣除 $20 ( $100-$20 )。  3 操作员 A 完成了修改工作,将数据版本号加一( version=2 ),连同帐户扣  除后余额( balance=$50 ),提交至数据库更新,此时由于提交数据版本大  于数据库记录当前版本,数据被更新,数据库记录 version 更新为 2 。  4 操作员 B 完成了操作,也将版本号加一( version=2 )试图向数据库提交数  据( balance=$80 ),但此时比对数据库记录版本时发现,操作员 B 提交的  数据版本号为 2 ,数据库记录当前版本也为 2 ,不满足 “ 提交版本必须大于记  录当前版本才能执行更新 “ 的乐观锁策略,因此,操作员 B 的提交被驳回。  这样,就避免了操作员 B 用基于 version=1 的旧数据修改的结果覆盖操作  员 A 的操作结果的可能。  从上面的例子可以看出,乐观锁机制避免了长事务中的数据库加锁开销(操作员 A 和操作员 B 操作过程中,都没有对数据库数据加锁),大大提升了大并发量下的系  统整体性能表现。 
  • 18. WMS的乐观锁Wms大量使用乐观锁机制,下面是去年11.11大促,因为乐观锁带来大麻烦例子: 1.新建一个波次,一个波次加载2000个发货订单 2.对该波次执行分配操作,可以理解为本次操作是一个历时很长的事务 3.波次分配(事务1):读取订单A的Version=1 4.有一个外部取消操作(事务2),对订单A进行了外部取消的操作,订单A的Version=2(该记录当前版本为2) 5.波次分配(事务1):完成所有订单的分配操作,更新了订单A的Version=2,执行Commit,订单A的Version=2(提交版本必须大于记  录当前版本才能执行更新 ),导致提交失败 6.操作了十几分钟的波次分配(长事务)失败,全部回滚
  • 19. 总结并发、事务、锁的关系1.并发会导致违反Atomic(原子性)、 Consistency(一致性)、 Isolation(隔离性) 、 Durability(持久性),使数据库变成脏数据 2.事务就是用来解决并发制造脏数据 3.事务解决并发制造脏数据,需要借助锁来实现
  • 20. 实例:1.通过JAVA操作Oracle数据来演示事务:
  • 21. (本页无文本内容)