关于ORACLE事务处理的一些笔记
这是2013年在看ORACLE概念手册的时候的一些笔记,现在整理如下(可能跟其他一些文章的内容有重复):
20131012 周六
oracle概念手册中文版 第4章 事务管理
事务具有原子性,要么全部提交,要么全部回滚。
事务开始于第一条可执行的sql语句,结束语commit或者rollback操作。执行一个ddl操作可以自动的触发commit操作。
下列java代码:
DataSource ds = DataSourceGen.getDataSourceFromXML();
Connection conn = ds.getConnection();
PreparedStatement ps = conn.prepareStatement("update pub_organ o set o.organ_name = '221112' where o.organ_id = 'O50649824'");
ps.executeUpdate();
ps = conn.prepareStatement("update pub_organ o set o.in_use = '1111' where o.organ_id = 'O50649824'");//此处会报错 因为in_use只能有一位
ps.executeUpdate();
conn.close();
每次执行executeUpdate都会自动触发commit操作,所以第二个报错,第一个仍然后执行成功。
如果加上conn.setAutoCommit(false);那么将不会再executeUpdate的时候自动触发commit,这种情形下将会在两种commit,一个是commit代码,一个是关闭conn自动触发commit。
也就是说如果不加conn.setAutoCommit(false);,那么每条sql都是一个事务。
执行一个ddl操作可以自动的触发commit操作。
begin
update pub_organ o set o.organ_name = '1' where o.organ_id = 'O50649824'; --事务开始第一个可执行语句
execute immediate 'create or replace view vvvv as select * from pub_organ';--ddl操作结束上一个事务 并commit(ddl操作本身要占用一条事务)
update pub_organ o set o.organ_name = '2' where o.organ_id = 'O50649824'; --新事务开始
update pub_organ o set o.in_use = 'ddd0' where o.organ_id = 'O50649824';--此处会报错 rollback
commit;
end;
oracle概念手册中文版 第13章 事务管理
oracle强制实现语句级读一致性。一个再复杂的查询,即使耗时很长,它最终执行获取的数据都是执行开始那个时间点的数据,执行过程中其他用户提交的改变不会造成影响。
隐式的查询,如delete和update中的where字句,insert中的子查询等,都能保证语句级读一致性。
如果 SELECT 列表中存在 PL/SQL 函数,那么函数中包含的 SQL 语句将遵从其自身的语句级读一致性,而非其所在 SQL 的读一致性.
当一个事务运行在串行化模式(serializable mode)下时,Oracle 还能够实现事务级读一致性(transaction-level read consistency),事务内所有数据访问均反映的是事务开始时的数据状态。
需要预防的现象:
5.1 脏读 读取到其他用户未提交的数据oracle实现了语句读一致性,所以不可能出现脏读的现象。
5.2 不可重复读 同一条数据两次读取的结果不一样
5.3 幻读 同一个where条件过滤 两次读取结果集不一样
隔离级别
已提交读取:默认的隔离级别。可以防止脏读。
串行化读取:oracle从已提交读取直接跳到了串行化读取,没有针对不可重复读和幻读分别提供隔离级别。
只读模式:只读事务只能看到事务执行前就已经提交的数据,且事务中不能执行 INSERT,UPDATE,及DELETE 语句。这个是oracle的创新,不是sql的标准。
分析:oracle这种设计,你要么使用默认的隔离级别,要么就串行。只读模式应用场景较少。
设置事务的隔离级别。
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
SET TRANSACTION READ ONLY;
已提交读取和串行化读取中:
读操作都不会阻塞其他用户的写操作。
已提交读取中sql的执行查询到的是sql执行那一点的数据状态。
串行化读取中slq的执行查询到的是事务开始那一点的数据状态。
串行化读取并不是真的串行的。串行事务中读取的内容可以被其他用户修改并提交,只是当前事务看不到而已。串行事务不能解决所有的问题,有时候需要在应用层开发代码来进行控制。
20131014 周一
oracle概念手册中文版 第13章 事务管理
如果系统中存在长时间运行的写事务,且其所操作的数据同时还会被大量的小事务更新,则此类系统不应采用串行化模式。因为长事务所需更新的数据可能会被其他事务抢先更新,则长事务可能需要重复地回滚,浪费系统资源。需要注意的是,其他数据库管理系统所实现的串行化隔离(使用读取锁(read-locking))同样不适合上述情况,因为长事务(即便是只执行读取操作的事务)会和短小的写事务相互阻塞。
使用select * form ttt for update;(在存储过程中需要在execute immediately中执行)可以获取对应行的排他锁。排他锁是一种阻止其他事务进行更新的锁。
获取表的排他锁:
lock table pub_organ in exclusive mode;锁定整张表其他用户不可以执行dml操作,也不可以获取其他任何锁。
获取表的共享锁:
lock table pub_organ in share mode;;锁定整张表其他用户不可以执行dml操作,但是也可以获取共享锁。
不管是那种模式,lock table的代码就像一句update的代码一样,遇到commit或者rollback后才会解除lock。如果表中的某一行被更新未提交,或者插入为提交,那么lock操作将阻塞。
1.共享锁只用于表级,排他锁用于行级。
2.加了共享锁的对象,可以继续加共享锁,不能再加排他锁。加了排他锁后,不能再加任何锁。
3.比如一个DML操作,就要对受影响的行加排他锁,这样就不允许再加别的锁,也就是说别的会话不能修改这些行。同时为了避免在做这个DML操作的时候,有别的会话执行DDL,修改表的定义,所以要在表上加共享锁,这样就阻止了DDL的操作。
4.当执行DDL操作时,就需要在全表上加排他锁。
如果事务T对数据A加上共享锁后,则其他事务只能对A 再加共享锁 , 不能加排他锁 。获准共享锁的事务只能读数据,不能修改数据。 排他锁 :如果事务T对数据A加上排他锁后,则其他事务 不能再对A加任任何类型的封锁 。获准排他锁的事务既能读数据,又能修改数据。 1、执行SELECT语句时可以获得共享锁。Oracle通过锁定指定表来确保没有人能够在你使用表数据时修改该表的结构,但是,被查询的记录并没有进行锁定。共享锁无法阻止其他用户读取和修改表中的数据,只能阻止其他用户使用ALTER TABLE命令改变指定表的结构或用DROP TABLE命令删除指定表。多个用户可以同时获得相同数据上的共享锁。 2、执行DML语句时可以获得排他锁,并且正在被修改的所有记录都会获得排他锁。在你启动的事务内,排他锁阻止其他用户获得正在处理的数据上的排他锁,直至执行COMMIT或ROLLBACK语句。这样,两个用户就无法同时更新相同的数据。某个用户试图更新被另一个用户锁定的数据时,第一个用户必须等待至去除排他锁后才能进行操作。 注:SELECT语句对正在查询的数据不进行锁定。
自治事务:如果对一个过程设置了自治事务,那么调用它的外层和它本身使用两个事务,互不影响。
关于ORACLE事务处理的一些笔记的更多相关文章
- MS SQL到Oracle的数据迁移笔记
MS SQL到Oracle的数据迁移笔记 一.任务背景 旧系统使用MS SQL Server数据库,新系统使用Oracle数据库,现在需要将旧系统中的数据迁移到新系统中,旧数据按照约定的规则转换后,能 ...
- Oracle教程之学习笔记
Oracle教程之学习笔记... ----------------------------------- Oracle教程:---学习笔记: ============================= ...
- Oracle数据库备份还原笔记
Oracle数据库备份还原笔记 通过查阅资料知道Oracle备份还原的方式有三种.分别的是导出/导入.热备份和冷备份.导出/导入是一种逻辑备份.而热备份和冷备份是物理备份.[参考资料(https:// ...
- Oracle及SQLPLUS使用笔记
Oracle及SQLPLUS使用笔记 自己之前粗粗的学过MySQL,学校用的是Oracle,学生使用sqlplus,这是个命令行界面的数据库管理软件(为了学习嘛,不用图形化可以理解),这里记录一些使用 ...
- oracle 事务处理 注意事项(笔记)
事务:一个独立的逻辑工作单元.它有特定的一系列必须作为一个整体一起成功或者失败的SQL语句组成.是一个要么全有要么全无,很个性的一个东东. 事务的四大属性——ACID属性:原子性(atomicity) ...
- 常用oracle语句-------------------------------------------》(笔记)
Orale常用语句 1:查询指定表名的字段 select * from sys.user_tab_columns where table_name=表名 //查询指定表名的字段 2: 查询数据库参 ...
- Oracle事务处理
原文转自:(http://www.cnblogs.com/ITtangtang/archive/2012/04/23/2466554.html) 一.事务概念事务用于保证数据的一致性,它由一组相关的d ...
- Oracle 事务处理
事务的四大特性 1.原子性(Atomicity) 事务的原子性是指事务中包含的所有操作要么都做,要么都不做,保证数据库是一致的. 2.一致性(Consistency) 一致性是指数据库在事务操作前和事 ...
- oracle事务处理及实例演示jdbc操作批量删除
事务 作为逻辑处理的基本单位,对于数据库操作来说由一条或者多条sql语句来构成.当然还有针对非数据库操作的,如在计算机中设置的还原点即是一个非常好的应用. 对于事务的基本性质在还有一篇中有所叙述:SQ ...
随机推荐
- Docker在windows环境下的安装部署
一.准备 系统环境:Windows 10 64bit Docker安装包:Docker for Windows Installer.exe 二.安装步骤 1.开启系统的hyper-v 2. 重启电脑后 ...
- Unity3D入门 UnityAPI常用方法和类
时间函数: 这里只列举了一部分,更多的看Scripting API using System.Collections; using System.Collections.Generic; using ...
- webdriervAPI(操作cookie)
from selenium import webdriver driver = webdriver.Chorme() driver.get("http://www.baidu.co ...
- Processor 介绍
1.概述 Sink Group允许用户将多个Sink组合成一个实体. Flume Sink Processor 可以通过切换组内Sink用来实现负载均衡的效果,或在一个Sink故障时切换到另一个Sin ...
- DatePickerDialog与OnDateSetListener基本用法与常见问题
日期时再显示更改控件一般我们使用构造方法public DatePickerDialog(@NonNull Context context, @Nullable OnDateSetListener li ...
- 再谈js对象数据结构底层实现原理-object array map set
如果有java基础的同学,可以回顾下<再谈Java数据结构—分析底层实现与应用注意事项>:java把内存分两种:一种是栈内存,另一种是堆内存.基本类型(即int,short,long,by ...
- 使用PowerShell 自动创建DFS复制组
运行环境:Windows Server 2012 R2 DFS 复制概述 DFS复制组 PowerShell脚本命令 需要注意的是DFS依赖域,若此服务器未存在于域控上,或未存在域内,则此脚本会报错 ...
- Swool的安装与使用
1.swoole的安装 //php最好用7.2以上的.直接去网站下载下来,然后与php一样编译安装. git下来后,因为没有config文件,故先在swool下载目录下执行: /.../php/bin ...
- 继续做一道linux的企业 面试题
把/dongdaxia目录及其子目录小所有以拓展名.sh结尾的文件中包含dongdaxia的字符串全部替换为dj. 解答:这道题还是用到了三剑客里的sed: 第一步:先在/dongdaxia目录及其子 ...
- zip 命令
NAME zip - package and compress (archive) files SYNOPSIS zip [-aABcdDeEfFghjklLmoqrRSTuvVwXy ...