sql五大类中的 DTL 数据事务语言
DTL,数据事务语言
事务的定义:
就是指一组相关的SQL操作,我们所有的操作都是事务中的。
注意:在数据库中,执行业务的基本单位是【事务】,不是以某一条SQL。
数据库在默认情况下,事务是都打开的,也就是说它一种处在事务当中的,一个事务的结束,代表着下一个事务的开启。
执行commit或者rollback指令时,会结束当前事务
作用:用来保证数据的平稳性和可预测性
例如:银行转账业务
SQL1:A账号向B账号转账10000
update tbl_account set balance=balance-10000 where accountNo=A账号;
SQL2:
update tbl_account set balance=balance+10000 where accountNo=B账号;
SQL1和SQL2必须处在同一个事务中,从而保证同时成功或者同时失败。
事务的四大特性(ACID):
atomic,原子性,事务是不可分割的,要么同时成功,要么同时失败;
consistency,一致性,事务一旦结束,内存中的数据和数据库中的数据是保持一致;
isolation,隔离性,事务之间互不干扰,一个事务的结束意味着下一个事务的开启;
duration,持久性,事务一旦提交,则数据持久化到数据库中,永久保存
在oracle中,操作事务的命令:
1.commit,提交事务
把事务中所有的数据持久化到磁盘中
2.rollback to 回滚点,回滚事务
把事务中所做的操作全部取消,回到初始化状态
3.savepoint 回滚点,设置回滚点
事务回滚时,回滚到起点
总结:
1.目前主流的数据库都是支持事务的,而且其中Oracle支持的最好
2.一个事务不能读取到另一个事务还没有提交的数据
3.DDL语句都会自动提交事务
4.DML语句不会自动提交事务,需要手动提交commit
-------------------------------------------
多事务的并发处理机制:
原因:多个事务同时操作一个表中的同一行数据,如果这些操作同时修改的话,就会产生并发问题,如果不处理,则会造成数据的不一致的情况
数据库可能产生的并发问题包括:
1.脏读
是指一个事务正在访问数据,并且对这个数据进行修改,而这种修改还没有提交到数据库中,而另一个事务也访问了这个数据,并且使用了这个数据。
解决方法:一个事务在修改数据时,该数据不能被其他事务访问
2.不可重复读:
是指一个事务多次读取同一条记录,如果此时另一个事务也访问并且修改了该数据,则就会出现多次读取出现数据不一致的情况,原来的数据变成了不可重复读取的数据。
解决方法:只有在修改事务完全提交过后才可以读取数据
3.幻读
是指一个事务修改表中的多行记录,但是此时另一个事务对该表格进行了插入数据的操作,则第一个事务会发现表格中会出现没有被修改的行,就像发生了幻象一样;
解决方法:在一个事务提交数据之前,其他事务不能添加数据
Oracle中采用‘锁’来做并发处理
1.表级排它锁(X) exclusive mode
2.表级共享锁(S) share mode
3.表中行级排它锁 share row exclusive
注:这三种锁是通过专门的命令来申请的
语法:
lock table tbl_name in mode;
例如:
--以共享锁锁表
lock table tbl_emp in share mode;
--以排它锁锁表
lock table tbl_emp in exlusive mdoe;
4.行级共享锁(RS) row share
5.行级排它锁(RX) row exclusive
注:这两种锁无需通过专门的命令申请,而是通过DQL和DML来自动申请的
注意:
1.所有的DQL语句默认情况下都会自动申请RS锁
2.所有的DML语句默认情况下都会自动申请RX锁,每一行记录都有唯一的RX锁
3.在项目中,为了满足业务要求,一般select语句需要申请RX锁
select语句通过for update来申请RX锁:
select * from s_emp for update;
select * from s_emp for update wait 5;等待5秒
select * from s_emp for update nowait;
其他数据库对象:
序列(SEQUENCE)
索引(INDEX)
视图(VIEW)
1.序列(SEQUENCE)
对应的数据库字典:user_sequences
作用:用来产生唯一性值的数据库特殊对象
创建序列语法:
create sequence 序列名
start with n 表示从几开始,默认值是1
increment by n 每计数一次增加多少,默认是1
maxvalue n 序列最高峰值n
minvalue n 序列最低峰值n
cache n 提供n个预分配的序列,保存在内存中
cycle | nocycle 是否循环
oredr | noorder 有序还是无序序列
例如:
--给员工创建一个序列
create sequence tbl_emp_id start with 4;
如何使用序列?
nextval:取序列的下一个值(tbl_emp_id.nextval)
currval:取序列的当的前值(tbl_emp_id.currval)
在插入数据时使用:
insert into tbl_emp values(tbl_emp_id.nextval,....)
删除序列:
drop sequence 序列名;
---------------------------------------------------
索引(INDEX)
对应的数据词典user_indexes
它是一个比较重要的数据库对象,作用是可以有效的提高数据库的查询效率(数据库性能优化)
创建索引的两种方式:
1自动创建
当表中的列添加了主键约束或者唯一性约束时,则系统会自动为此列创建唯一性的索引,索引名就是约束名
2手动创建
语法:
create index 索引名 on 表名(列名...);
create index 索引名 on emp(name)
select salary from emp where name = 'mark';
select salary from emp wehre rowid = (select rowid from emp where name= 'mark');
注意:
1.索引有自己独立的储存空间和命名空间
2.创建索引也会相对牺牲一些数据库性能
索引的原理:
1.默认情况下,索引是采用BTree(二叉树)的数据结构
2.伪列(rowid),存放的数据行记录的正真“物理地址”。
--根据某物理地址查询某一行记录
//先获取记录的rowid
select rowid from s_emp where first_name="Carmen";
//根据行记录rowid查找相应的记录
select* from s_emp where rowid=(select rowid from s_emp where first_name="Carmen");
3.索引建立的原理:
把创建索引的列值与rowid合成一个键值树,这个键值对就是索引,然后把它们存放到指定的数据结构中(二叉树,位图)中,并且是独立的索引空间
4.索引查询的原理:
当我们的查询语句中where 条件的列建立了索引,则查询分为一下2步:
a.先查索引,在句列中的值直接找到rowid
b.根据第一步得到的rowid直接定位到相应的行记录结束查询
5.建立索引的策略:
a.主键和唯一性列 合适
b.不经常发生改变的列 合适
c.满足以上两个条件,经常做查询的列 合适
d.重复值太多的列 不合适
e.null值太多的列 不合适
6.删除索引
drop index 索引名;
-----------------------------------------------------
视图(VIEW)
对应的数据字典:user_view
他是一个数据库对象,它是表格的一个“窗口”,用来保存查询语句的对象,视图是依附于表的,并且与表格共享储存空间。
定义:本质就是一条合法的查询语句
作用:
1.配合权限,根据业务来做分级管理
2.减少复杂性,增加数据的安全性
创建视图的语法:
create view 视图名 as 子句;
with read only ;视图只读
例如:
--以只读方式创建s_emp表中id,salary两列的视图
create view view_name as select id,salary from s_emp with read only;
注意:操作视图必须拥有一定的权限,对只读视图不能进行DML操作
删除视图
drop view 视图名;
视图分类:
关系视图,内嵌视图,对象视图,物化视图
-----------------------------
补充:查询当前用户可执行什么操作
select * from session privs;
--查询某个权限可执行的所有操作
select* from DBA_SYS_PRIVS where grantee='DBA';(需要DBA)
--查询当前用户被赋予的系统角色
select *from SESSIONS_ROLES order by role;
--授予权限的两种方式:
1.grant createany view to 用户名
2.grant connect,resource,dba to 用户名
练习:
--创建41部门所有员工的简单视图(必须拥有操作视图的权限)
create view view_emp_41 as select * from s_emp where dept_id=41;
sql五大类中的 DTL 数据事务语言的更多相关文章
- 清空SQL Server数据库中所有表数据的方法(转)
清空SQL Server数据库中所有表数据的方法 其实删除数据库中数据的方法并不复杂,为什么我还要多此一举呢,一是我这里介绍的是删除数据库的所有数据,因为数据之间可能形成相互约束关系,删除操作可能陷入 ...
- 清空SQL Server数据库中所有表数据的方法
原文:清空SQL Server数据库中所有表数据的方法 其实删除数据库中数据的方法并不复杂,为什么我还要多此一举呢,一是我这里介绍的是删除数据库的所有数据,因为数据之间可能形成相互约束关系,删除操作可 ...
- C++类中的static数据成员,static成员函数
C++类中谈到static,我们可以在类中定义static成员,static成员函数!C++primer里面讲过:static成员它不像普通的数据成员,static数据成员独立于该类的任意对象而存在, ...
- SQL Server数据库中导入导出数据及结构时主外键关系的处理
2015-01-26 软件开发中,经常涉及到不同数据库(包括不同产品的不同版本)之间的数据结构与数据的导入导出.处理过程中会遇到很多问题,尤为突出重要的一个问题就是主从表之间,从表有外检约束,从而导致 ...
- SQL Server 2008中的MERGE(数据同步)
OK,就像标题呈现的一样,SQL Server 2008中的MERGE语句能做很多事情,它的功能是根据源表对目标表执行插入.更新或删除操作.最典型的应用就是进行两个表的同步. 下面通过一个简单示例来演 ...
- 怎么在SQL Server 2008中还原.mdf数据文件
还原数据库文件的过程中,只有mdf文件,该怎么还原?在原来的SQL Server 2005中直接点击数据库然后附加就可以还原,但是在2008 版本中附加数据库文件则会出错(只有mdf文件){执行Tra ...
- SQL 在表中随机取数据
在一张10万行产品表(Product)中,随机取10条数据的几种方式: SET STATISTICS IO ON SELECT TOP 10 ID FROM dbo.Product(NOLOCK) W ...
- SQL Server查询中对于单列数据','分割的数据进行的拆分操作,集合的每一个行变多行
1.cross apply cross apply 我们可以把它看作成是inner join 来使用 2.outer apply outer apply我们可以把它看做是left join 来使用 注 ...
- 同样的一句SQL语句在pl/sql 代码块中count 没有数据,但是直接用SQl 执行却可以count 得到结果
pl/sql 代码块: SELECT count(distinct t2.so_nbr) INTO v_count2 FROM KFGL_YW_STEP_qd t2 WHERE t2.partitio ...
随机推荐
- 前端性能优化:gzip压缩文件传输数据
一.文件压缩的好处 前端生产环境中将js.css.图片等文件进行压缩的好处显而易见,通过减少数据传输量减小传输时间,节省服务器网络带宽,提高前端性能. 二.http协议如何支持压缩文件的传输 1.浏览 ...
- url携带的参数获取并处理demo
url demo: http://servername/webname/pagename.csp?paramName=paramValue¶mName2=paramName2& ...
- 在使用Ajax请求返回json数据的时候IE浏览器弹出下载保存对话框的解决方法
在使用Ajax请求返回json数据的时候IE浏览器弹出下载保存对话框的解决方法 最近在做一个小东西,使用kindeditor上传图片的时候,自己写了一个上传的方法,按照协议规则通过ajax返回json ...
- OD 实验(八) - 对一个程序的逆向
程序: 运行 弹出 NAG 窗口,提示要花 20 美元注册 然后会进入主窗口 提示剩余 5 天的使用时间 点击,菜单栏 -> Help -> About 显示未注册版本 逆向: 用 OD ...
- ce
一,什么是epel 如果既想获得 RHEL 的高质量.高性能.高可靠性,又需要方便易用(关键是免费)的软件包更新功能,那么 Fedora Project 推出的 EPEL(Extra Packages ...
- 关于where和having的直观理解
一,查询区别 where是对前面select的字段没有要求,直接查询库表的 having是对前面的select的字段有要求,字段已经select出来的 可以用having进行处理 select id, ...
- halcon 如何把一个region截取出来保存为图像
read_image(Image,'monkey') gen_circle(region,200,200,150) reduce_domain(Image,region,Mask) crop_doma ...
- iOS学习之iOS沙盒(sandbox)机制和文件操作之NSFileManager
我们看看NSFileManager如何使用.包括创建文件,目录,删除,遍历目录等. 1.在Documents里创建目录 创建一个叫test的目录,先找到Documents的目录, [cpp] view ...
- Perl 子程序(函数)
1.Perl 子程序(函数)Perl 子程序也就是用户定义的函数.Perl 子程序即执行一个特殊任务的一段分离的代码,它可以使减少重复代码且使程序易读. Perl 子程序可以出现在程序的任何地方,语法 ...
- Creating Cubemaps in Unity3D
[Creating Cubemaps in Unity3D] 1.在Editor目录下生成GenerateStaticCubemap.cs. 2.编写代码,生成一个继承于ScriptableWizar ...