DML语句包括:
DML语句错误的原因:
1、语法错误
2、引用不存在的对象和列
3、访问权限问题
4、违反约束条件
5、空间问题
控制事务
一个事务包含一个或多个DML语句,以ROLLBACK或COMMIT命令结尾;
Oracle事务一致性是靠undo segments和redo log files文件保证的;
关系型数据库必须保证:ACID
A:Atomicity 原子性:原子性是保证事务中的各个部分要么全部执行成功,要么全部失败;
C:Consistency 一致性:一致性要保证所有的查询结果都是一样的;
I:Isolation 隔离性:每一个事务之间都是互相不可见的;
D:Durability 持久性:一旦事务完成,数据库就不能丢失数据;
当一个查询进行时发现其中的数据已经更改了,那么他就会到undo segment中去读取旧的版本;
所有的DML操作都需要在datablocks ,undo blocks, 并且产生redo logs
A,C and I需要产生undo blocks;
D需要产生 redo logs;
只有事务提交后,数据的改变才能永久的保存下来,并且被其他session可见
事务是不能嵌套的,不允许在一个事务结束前开始另外一个事务;事务是嵌套可以通过PL/SQL来完成;
显示的事务控制语句的命令为:COMMIT,ROLLBACK, SAVEPOINT;也有隐身控制的语句,如:
SAVEPOINT并不是SQL标准的一部分;
COMMIT:并不会用DBWn往磁盘数据文件上写数据,而仅仅是将log buffer中的数据写入磁盘,并且将事务的标志置为完成;
The redo log stream includes allchanges: those applied to data segments and to undo segments, for bothcommitted and uncommitted transactions;
当你使用EXIT退出sqlplus时,事务会提交,当你点击关闭按钮退出sqlplus时,事务会回滚;
有一个SET AUTOCOMMIT ON语句可以在SQLPLUS中设置,在DML语句执行时,自动提交事务;
PL/SQL对象
PL/SQL是Oracle公司私有的第三代语言,PL/SQL总是在数据库上进行运行,而不管它是存储在服务器上还是客户端。
Stored PL/SQL对象是存储在数据字典中的,
anonymous PL/SQL对象是存储在远端的;
PL/SQL对象总共有六种类型:
使用触发器的好处:
锁
one session can take an exclusivelock on a row, or a whole table, at a time
but shared locks can be taken on the same objectby many sessions;
不应该在行级别上使用共享锁;
使用共享锁的目的是防止其他会话在这个对象上加操作锁;
当执行DML语句的时候,会话必须在操作对象的行级别上加操作锁,在表级别上加共享锁;
加共享锁的目的是防止其他会话对该表进行DDL操作;
队列机制
可以使用SELECT….FOR UPDATE NOWAIT 或 SELECT ….FOR UPDATE WAIT(n),来避免使用该语句是的排队等待;
引起锁竞争的原因:
长时间 运行的事务会导致锁竞争;
一些第三方用户 进程会提高锁的级别,从行级锁提高的表级锁;
当会话发生锁定而需要终止时,可以使用Database Control发现锁定的的会话,并使用ALTER SYSTEM KILL SESSION 命令来终止会话
死锁不是DBA的错误,而是错误的程序设计产生的,它可以由数据库自动的进行处理;