Oracle基础:数据库操做_数据库事务_表的锁定

数据库操做语句:数据库

 

INSERT INTO 表名[(字段列表)] VALUES ( 表达式列表);安全

例子:INSERT INTO emp(empno,ename,job,hiredate) VALUES (1001, '小马', 'CLERK', to_date('2004-11-27','yyyy-mm-dd'));并发

INSERT INTO 表名(字段列表) SELECT(字段名1, 字段名2, ...) FROM 另外的表名;性能

例子:INSERT INTO manager SELECT empno, ename, sal,job FROM emp WHERE job = 'CLERK';spa

 

修改数据的语句UPDATE对表中指定字段的数据进行修改,通常须要经过添加WHERE条件来限定要进行修改的行,若是不添加WHERE条件,将对全部的行进行修改。 (1) 修改数据的语句UPDATE的基本语法以下: UPDATE 表名 SET 字段名1=表达式1, 字段名2=表达式2, ... WHERE 条件;blog

本例中不能省略WHERE条件,不然将会修改表的全部行。事务

UPDATE 表名 SET(字段名1, 字段名2, ...)=SELECT (字段名1, 字段名2, ...) FROM 另外的表名WHERE条件;ci

例子:UPDATE manager SET (ename, sal) =(SELECT ename,sal FROM emp WHERE empno = 7788) WHERE empno = 2000;it

 

删除数据的基本语法以下: DELETE FROM 表名 WHERE 条件; 要从表中删除知足条件的记录,WHERE条件通常不能省略,若是省略就会删除表的所有数据。io

删除记录并不能释放Oracle中被占用的数据块表空间,它只是把那些被删除的数据块标成unused。

DELETE FROM emp WHERE empno=1000;

若是确实要删除一个大表里的所有记录,能够用TRUNCATE 命令,它能够释放占用的数据块表空间,语法为: TRUNCATE TABLE 表名;

 

删除重复记录

方法原理:

一、Oracle中,每一条记录都有一个rowid,rowid在整个数据库中是惟一的, rowid肯定了每条记录是在ORACLE中的哪个数据文件、块、行上。

二、在重复的记录中,可能全部列的内容都相同,但rowid不会相同,因此只要肯定出重复记录中   那些具备最大rowid的就能够了,其他所有删除。

 

完全删除manager表的内容。

执行如下的命令: TRUNCATE TABLE manager;

执行结果: 表已截掉。

说明:此命令和不带WHERE条件的DELETE语句功能相似,不一样的是,DELETE命令进行的删除能够撤销,但此命令进行的删除不可撤销。

注意:TRUNCATE TABLE命令用来删除表的所有数据而不是删除表,表依旧存在。数据不能恢复,不用commit,不能rollback;

 

数据库事务

事务的特征:ACID

原子性(Atomicity) : 数据库中的事务执行是做为原子,不可再分,整个语句要么执行,要么不执行

一致性(Consistency) : 在事务开始以前和事务结束之后,数据库的完整性约束没有被破坏(如外键、not null)

理解隔离性(Isolation) : 事务的执行是互不干扰的,一个事务不可能看到其余事务运行时,中间某一时刻的数据

理解持久性(Durability) : 在事务完成之后,该事务所对数据库所做的更改便持久的保存在数据库之中,并不会被回滚

 

Oracle的事务控制:

Dirty read: 脏读意味着一个事务读取了另外一个事务未提交的数据

Phantom read: 幻读,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的所有数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。若是第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉同样

Unrepeatable Read :不可重复读,即一个事务范围内两个相同的查询却返回了不一样数据

Lost update: 丢失更新,即两个并发的事务,后提交的事务把先提交事务的修改结果覆盖了

 

Oracle的事务控制:

Read uncommited :性能最佳,但容许出现脏读

Read commited : 不容许脏读,可能出现不可重复读,幻读

Repeatable Read: 能够重复读,没有脏读,可能出现幻读

Serializable: 性能最差,但安全性最高 Oracle默认的事务级别为read commited

 

数据库事务的应用

数据库事务处理可分为隐式和显式两种。

显式事务操做经过命令实现,隐式事务由系统自动完成提交或撤销(回退)工做,无需用户的干预。

隐式提交的状况包括:当用户正常退出SQL*Plus或执行CREATE、DROP、GRANT、REVOKE等命令时会发生事务的自动提交。

还有一种状况,若是把系统的环境变量AUTOCOMMIT设置为ON(默认状态为OFF),则每当执行一条INSERT、DELETE或UPDATE命令对数据进行修改后,就会立刻自动提交。

设置命令格式以下:

SET AUTOCOMMIT ON/OFF

隐式回退的状况包括:当异常结束SQL*Plus或系统故障发生时,会发生事务的自动回退。

 

 表的锁定:

隐式锁和显式锁

在Oracle数据库中,修改数据操做时须要一个隐式的独占锁,以锁定修改的行,直到修改被提交或撤销为止。 若是一个会话锁定了数据,那么第二个会话要想对数据进行修改,只能等到第一个会话对修改使用COMMIT命令进行提交或使用ROLLBACK命令进行回滚撤销后,才开始执行。

默认是隐式加锁,主动锁定行或表,防止其余会话对数据的修改

 

 锁定行:

SELECT * FROM emp WHERE deptno=10 FOR UPDATE;

锁定表:

LOCK语句用于对整张表进行锁定。

语法以下: LOCK TABLE 表名 IN {SHARE|EXCLUSIVE} MODE 对表的锁定能够是共享(SHARE)或独占(EXCLUSIVE)模式。共享模式下,其余会话能够加共享锁,但不能加独占锁。在独占模式下,其余会话不能加共享或独占锁。

乐观锁和悲观锁

悲观锁(Pessimistic Locking):在整个数据处理过程当中,采起保守态度,将数据所有处于锁定 状态(不容许修改、删除)  如: SELECT * FROM emp WHERE deptno=10 FOR UPDATE; (只容许查询,不容许修改和删除锁定的数据)

乐观锁( Optimistic Locking ):乐观假设不会发生并发冲突,只在提交操做时检查是否违反数据完整性。 乐观锁一般采用检查version、时间戳、关键数据等方式 select ver from emp where empno=7782; update emp set sal =1909,ver=ver+1 where empno=7782 and ver=20; 因为悲观锁在并发环境中影响性能,建议尽可能使用乐观锁!

相关文章
相关标签/搜索