东软实习之数据库(9)——数据操作与事务控制
##数据操作语言
数据操作语言
Data Manipulation Language ,简称DML,主要用来实现对数据库表中的数据进行操作。
数据操作语言主要包括如下几种:
-
-
-
- 增加行数据:使用INSERT语句实现
- 修改行数据:使用UPDATE语句实现
- 删除行数据:使用DELETE语句实现
- 合并行数据:按照指定条件合并两个表的数据,使用MERGE语句实现
-
-
#插入数据
使用INSERT语句向表中插入数据,语法结构如下:
采用这种语法一次只能追加一条记录;
column部分叫做列名列表,value部分叫做值列表,列名列表和值列表必须在个数及数据类型上保持一致;
列名列表部分可以省略,如果省略,默认包括该表的所有列,列的顺序为使用 desc 表名 命令所查看的顺序;
列名列表部分也可以指定部分非空的列,注意值列表必须和列明列表对应; 字符和日期型数据必须要用单引号括起来。
插入空值NULL
插入日期值
SYSDATE 函数记录当前日期和时间
插入数据
插入多行数据
不必书写values子句
INSERT子句和数据类型必须和子查询中列的数量和类型相匹配中列的数量
#修改数据
修改数据使用UPDATE子句完成,语法结构如下:
-
-
- WHERE子句用来限定修改哪些行。
- SET子句用来限定修改哪些列。
-
*error*
*相关UPDATE*
在emp表中用一个附加的列dname来存储部门名称,并填充每个员工的部门信息到该列上
##删除数据
语法结构
使用 DELETE 语句删除表中满足条件的行记录
基于另一个表删除本表记录
在DELETE语句中使用子查询可以基于另一个表删除本表记录。 删除部门SALES的员工记录。
相关DELETE
使用相关DELETE,你可以使用相关子查询来只删除那些已经存在于另一张表中的行。
##使用ROWID操作数据
ROWID介绍
ROWID: 伪列,是表中虚拟的列,是系统自动产生的。
每一行记录中都包含ROWID,表示这一行的唯一地址。
ROWID标识了Oracle如何定位行,通过 ROWID 能快速定位一行记录。
ROWID的格式: ROWID中包含该行数据的物理位置信息,所以能快速的定位记录
ROWID的应用: 快速定位单行记录,DML语句可以使用ROWID操作数据,效率最快
作为表行的唯一标识
##事务处理语言
事务处理语言 Transaction Process Language ,简称TPL,主要用来对DML操作的结果进行确认或取消。
事务处理语言主要包括如下几种:
- 提交:确认对数据库所做的DML操作,使DML操作生效,使用ROLLBACK语句实现。
- 回滚:取消对数据库所做的DML操作,使DML操作无效,使用ROLLBACK语句实现。
- 设置保存点:对数据库所做的DML操作设置一个标记,用户后续操作可以回滚到此标记,使用SAVEPOINT语句实现。
事务概念及特征
概念:事务(Transaction)也称工作单元,是一个或多个SQL语句所组成的序列,这些SQL操作作为一个完整的工作单元,要么全部执行,要么全部不执行。
通过事务的使用,能够使一系列相关操作关联起来,防止出现数据不一致现象。
事务的组成:在ORACLE数据库中,事务由以下语句组成:
-
-
-
- 一组相关的DML语句
- 一个 DDL语句 或者一个DCL语句 或者一个TCL语句
-
-
事务的特征:
可用四个字母的缩写表示:即ACID
- 原子性(Atomicity) 事务就像一个独立的工作单元。原子性保证要么所有的操作都成功,要不全都失败。如果所有的动作都成功了,我们就说这个事务成功了,不然就是失败的,然后回滚。
- 一致性(Consistency) 一旦事务完成了(不管是成功的,还是失败的),整个系统处于操作规则的统一状态,也就是说,数据不会损坏。
- 隔离性(Isolation) 事务的隔离性是指数据库中一个事务的执行不能被其它事务干扰。所以,事务应该隔离起来,目的为了防止同时的读和写操作。这就需要事务与锁同时使用。
- 持久性(Durability) 事务的持久性也称为永久性(Permanence),指事务一旦提交,则其对数据库中数据的改变就是永久的。
事务控制
事务的控制分为:显式控制及隐式控制。
显示控制:
显示提交:Commit
显示回滚:Rollback
隐式控制:
隐式提交:当下列任意一种情况发生时,会发生隐式提交 执行一个DDL 语句 执行一个DCL 语句 从 SQL*Plus正常退出(即使用EXIT或QUIT命令退出)
隐式回滚:当下列任意一种情况发生时,会发生隐式回滚 从SQL*Plus中强行退出 客户端连接到服务器端异常中断 系统崩溃
设置保存点语法:
SAVEPOINT 保存点名称;
——定义保存点 ROLLBACK TO保存点名称;
——回滚到已定义保存点
事务控制
-
-
-
- 开始:事务开始于上一个事务结束后执行的第一个DML语句
- 结束:事务结束于下面的任一种情况的发生:
- 执行了COMMIT 或者ROLLBACK命令
- 隐式提交(单个的DDL或DCL语句)或自动提交
- 用户退出
- 系统崩溃
-
-
事务控制
执行Commit或Rollback前的数据状态
- 数据变化前的状态可以被恢复
- 当前会话可以使用SELECT语句来验证 DML操作后的结果
- 其它会话不能查看由当前用户的DML操作结果
- 受影响记录被锁定,也就是其它用户不能改变受影响记录中的数据
Commit后的状态
- 在数据库中数据变化成为永久性的
- 先前的数据状态永久性的消失
- 所有用户/会话都可以查询提交后的结果 锁定的记录被释放,可以有效地被其他用户操作
- 所有的存储节点被清除
Rollback后的数据状态
使用ROLLBACK 可以放弃所有悬而未决的变化。
- 数据变化是可以撤销的
- 先前的数据状态被恢复
- 锁定的记录被释放
- 所有的存储节点被清除
读一致性
-
-
- 读一致性保证了不同会话在同一时间查看数据时,数据一致。
- ORACLE在两个不同级别上提供读一致性:语句级读一致性和事务级一致性。
- 事务级一致性,当一个会话正在修改数据时,其它的会话将看不到该会话未提交的修改。
- 语句级读一致性,保证单个查询所返回的数据与该查询开始时刻相一致。所以一个查询从不会看到在查询执行过程中提交的其它事务所作的任何修改。
-
##锁
并发事务
如果多个事务同时访问某一个资源,比如同时修改表中的某一行。 并发事务可能出现如下问题:
- 脏读:就是读取了未提交的数据,如B事务读取了A事务未提交的数据
- 不可重复读:就是一个事务在多次读取一个数据时,数据不同,可能是另一个事务修改了数据。
- 更新丢失:就是两个事务同时更新了一条数据,先更新的就会丢失数据。
- 幻读:事务A在读取数据的时候,数据发生了变化。
锁的概念
锁用来在多用户并发访问和操作数据库时保证数据的一致性。
锁由Oracle自动管理。如一个DML操作,ORACLE默认的机制是在DML操作涉及到的行上加锁。
锁在被相关的操作申请并持有后,会一直保持到事务的结束,事务结束后,锁才会被释放。
查询不需要任何锁。
锁的模式
-
-
-
- 排它锁模式(Exclusive)排它锁在被释放之前,会阻止其锁住的资源被其他任何事务共享。
- 共享模式(Share)
-
-
锁的分类
两种类型的锁,DML锁和DDL锁。
DML锁,也称数据锁,用于在数据被多个不同的用户改变时,保证数据的完整性。
DDL锁,也称为数据字典锁,执行DDL语句时,DDL语句涉及到的对象获得DDL锁。由于被持有的时间很短,因此很少看到冲突的DDL锁,并且以nowait方式被请求。
锁的使用
ORACLE中实现加锁机制主要有两种方式:
1.自动加锁
2.手动加锁
##本章重点总结
- 插入数据的方法:一次插入多行,插入空值、插入特殊值、插入多行;
- 修改表中数据:修改指定行,修改所有列、修改多列、嵌入子查询修改、相关UPDATE;
- 删除表中数据:删除指定行、删除所有行、嵌入子查询删除、相关DELETE;
- 数据库事务:事务组成、事务特性、事务控制、事务开始和结束;
- 了解锁的应用。