Oracle基础 事务
一、事务
事务就是业务上的一个逻辑单元,它能够保证其中对数据所有的操作,要么全部成功,要么全部失败。
二、事务的特性:
1、原子性:事务是SQL中的最小执行单位,不能再进行分割。要么全部执行,要么全部不执行
2、一致性:在事务操作前和事务操作后,数据必须处于一致状态。
3、隔离性:事务之间是相互隔离的,多个事务不会相互影响。
4、持久性:当事务提交后,数据则永久有效。
读取事务异常:
1、脏读:一个事务读取了另一个事务未提交的数据。
2、不可重复读:一个事务再次读取之前曾经读取过的数据时,发现该数据已经被另一个已提交的事务修改。
3、幻读:一个事务根据相同的查询条件,重新执行查询,返回记录中包含了与前一次执行查询返回的记录不同的行。
事务的隔离级别:
ANSI SQL-92标准中定义的事务级别:
1、Read Uncommitted:最低等级的事务隔离,它仅仅保证了读取过程中不会取到非法数据。
2、Read Comitted:此级别的事务隔离保证了一个事务不会读到另一个并行事务已修改但未提交的数据,此级别的事务级别避免了”脏读“。
3、Repeatable Read:此级别的事务隔离避免了”脏读“和”不可重复读“异常现象的出现。一个事务不可能更新已经由另一个事务读取但未提交(回滚)的数据。
4、Serializable:最高等级的隔离级别,提供了最高等级的隔离机制,三种异常情况都能避免。该事务以串行执行的方式执行。
Oracle中提供的隔离级别:
1、Read Comitted:Oracle默认的隔离级别,此级别的事务保证了一个事务不会读到另一个并行事务已修改但未提交的数据,也就是说,此等级的事务避免了"脏读"。
2、Serializable:最高等级的隔离级别,提供了最高等级的隔离机制,三种异常情况都能避免。
3、Read Only:Read Only是Serializable的子集,指事务中不能有任何修改数据库中数据的语句(DML),以及修改数据结构的语句(DDL)。只允许读不允许改。
三、事务控制语句:
1、COMMIT:提交事务,对数据库的修改进行保存。
2、ROLLBACK:回滚事务,取消对数据库所做的修改。
3、SAVEPOINT:在事务中创建存储点。
4、ROLLBACK TO <SAVEPOINT>:将事务回滚到存储点。
5、SET TRANSACTION:设置事务的属性。
四、使用事务的步骤:
1、开启事务。在Oracle中,事务是在上一次事务结束以后,数据“第一次”被修改时自动开启。
2、进行(多次)数据操作(增、删、改)。
3、结束事务:事务结束有两种情况.
(1)事务被提交:
a.发出COMMIT命令。
b.执行DDL语句。如果DDL语句前面有DML语句,则Oracle会自动把前面的DML语句作为一个事务提交。
c.与Oracle断开连接,或退出PL/SQL Developer,事务会自动提交。
(2)数据被撤销:
a.发出ROOLBACK命令.
b.服务器进程异常结束。
c.DBA停止会话。
例:模拟银行转账:
--创建测试表,建立金额检查约束,必须大于0
CREATE TABLE ACCOUNT
(
userid NUMBER CONSTRAINT pk_bid PRIMARY KEY,
username VARCHAR2(20) NOT NULL,
balance NUMBER(16,2) NOT NULL CONSTRAINT ck_balance CHECK(balance > 0)
) --插入测试数据
INSERT INTO ACCOUNT VALUES(1,'张三',3000);
INSERT INTO ACCOUNT VALUES(2,'李四',1);
--银行转账事务
BEGIN
UPDATE ACCOUNT SET balance = balance - 2000 WHERE userid = 1;
UPDATE ACCOUNT SET balance = balance + 2000 WHERE userid = 2;
COMMIT;
EXCEPTION
WHEN OTHERS THEN ROLLBACK;
END;
例:操作dept表:
INSERT INTO dept VALUES(50,'a',NULL); --插入两条记录
INSERT INTO dept VALUES(60,'b',NULL);
SAVEPOINT a; --设置保存点
INSERT INTO dept VALUES(70,'c',NULL); --插入新的数据
ROLLBACK TO SAVEPOINT a; --回到保存点a,则保存点后的SQL语句失效。
select * FROM dept; --插入c的值没有了。
ROLLBACK; --回滚事务,插入的a和b的值也没有了。
SELECT * FROM dept;
总结:
⑴事务用于确保数据的一致性,由一组相关的DML语句组成,要么全部不执行,要么全部撤销。
⑵当执行事务操作时,Oracle会自动在作用的表上加锁,以防止其他用户锁定该表,同时也在行上加行级锁,以防止其它事务在相应行上执行DML操作。
⑶当执行事务提交或者回滚时,Oracle会确认事务变化或回滚事务、结束事务、删除保存点,释放锁。
⑷事务期间应避免与使用者交互。
⑸尽可能让事务持续时间越短越好。
⑹在事务中尽可能存取最少的数据量。
五、SET TRANSACTION
可以用来设置事务的属性,但是必须放在事务的第一条。可以设置3个属性。
1、设置事务的隔离级别。
1)SET TRANSACTION READ ONLY
2)SET TRANSACTION ISOLATION LEVEL READ COMMITTED
3)SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
2、规定回滚事务时所使用的存储空间。
3、对事务命名。
SET TRANSACTION NAME 'tname';
Oracle基础 事务的更多相关文章
- Oracle基础:数据库操作_数据库事务_表的锁定
数据库操作语句: INSERT INTO 表名[(字段列表)] VALUES ( 表达式列表); 例子:INSERT INTO emp(empno,ename,job,hiredate) VALUES ...
- 数据库事务隔离级ORACLE数据库事务隔离级别介绍
本文系转载,原文地址:http://singo107.iteye.com/blog/1175084 数据库事务的隔离级别有4个,由低到高依次为Read uncommitted.Read committ ...
- 图说Oracle基础知识(一)
本文主要对Oralce数据库操作的基础知识进行一下梳理,以便进行归纳总结.适用于未使用过Oracle数据库的读者,或需要学习Oracle数据库方面的基础知识.如有不足之处,还请指正. 关于SQL介绍的 ...
- Oracle基础了解
数据库: 关系型数据库 select * from 表名 非关系型数据库(做不到复杂查询) 以对象的形式进行存储 {"aaa":"ccc"}---键值对 ora ...
- Oracle基础学习笔记
Oracle基础学习笔记 最近找到一份实习工作,有点头疼的是,有阶段性考核,这...,实际想想看,大学期间只学过数据库原理,并没有针对某一数据库管理系统而系统的学习,这正好是一个机会,于是乎用了三天时 ...
- ORACLE| ORACLE基础语法汇总
创 ORACLE| ORACLE基础语法汇总 2018-07-18 16:47:34 YvesHe 阅读数 9141更多 分类专栏: [数据库] 版权声明:本文为博主原创文章,遵循CC 4.0 B ...
- Oracle打怪升级之路一【Oracle基础、Oracle查询】
前言 背景:2021年马上结束了,在年尾由于工作原因接触到一个政府单位比较传统型的项目,数据库用的是Oracle.需要做的事情其实很简单,首先从大约2000多张表中将表结构及数据导入一个共享库中,其次 ...
- Oracle一个事务中的Insert和Update执行顺序
今天碰到了一个奇怪的问题,是关于Oracle一个事务中的Insert和Update语句的执行顺序的问题. 首先详细说明下整个过程: 有三张表:A,B,C,Java代码中有一段代码是先在表A中插入一条数 ...
- oracle基础教程(8)oracle修改字符集
oracle基础教程(8)oracle修改字符集 1.用dba连接数据库 -->sqlplus / as sysdba 2.查看字符集 -->SELECT parameter, value ...
随机推荐
- php连接oracle10数据库 转载
本文转载自:http://blog.csdn.net/wzg199088/article/details/6678241 一.配置环境: 访问Oracle8以上的数据库需要用到Oracle8Call- ...
- 用来用去还是觉得SDCMS好用
用来用去还是觉得SDCMS好用 现在可以算是精通了.呵呵,欢迎交流
- spring与jpa整合 简化persistence.xml配置文件 使用属性文件 数据源dbcp访问数据库
===========appliction.xml配置文件======================= <?xml version="1.0" encoding=" ...
- Java 线程池学习
Java里面线程池的顶级接口是Executor,但是严格意义上讲Executor并不是一个线程池,而只是一个执行线程的工具.真正的线程池接口是ExecutorService. 下面这张图完整描述了线程 ...
- 关于mysql函数GROUP_CONCAT
GROUP_CONCAT()是MySQL数据库提供的一个函数,通常跟GROUP BY一起用,具体可参考MySQL官方文挡:http://dev.mysql.com/doc/refman/5.0/en/ ...
- CMSIS-DAP调试器
http://www.keil.com/support/man/docs/dapdebug/dapdebug_introduction.htm CMSIS-DAP is the interface f ...
- Windows转到linux中,文件乱码,文件编码转换
最近,学习又重新开始Linux学习,所以一直在Centos中,昨天一朋友把他在Windows下写的C程序发给我,我欣然答应,本以为很快就能在我的Linux系统中运行起来.没想到出现了乱码,结果想把这个 ...
- Jquery Mobile 百度地图 Demo
首先非常感谢franck分享的Demo! Demo截图: 下面是franck对此Demo的说明: 原理:1.通过百度拾取坐标系统获得点位的坐标. http://api.map.baidu.com/lb ...
- Codeforces Round #136 (Div. 1)C. Little Elephant and Shifts multiset
C. Little Elephant and Shifts Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/pro ...
- 在Swift中的ASCII到字符转换的问题
我们在C++里处理字符通常是这样的 char a = 'A' // A = 65 printf("'%c' = %d", a + 1, a + 1) // 'B' = 66 这在号 ...