- 浏览: 485318 次
- 性别:
- 来自: OnePiece
文章分类
- 全部博客 (196)
- --------- 基础----------- (0)
- java 碎碎念 (12)
- java 并行编程 (11)
- java I/O (6)
- java Charset & Encoding (2)
- spring学习笔记 (8)
- 正则表达式 (5)
- web前端-javascript (11)
- web前端-jQuery (7)
- web前端-碎碎念 (1)
- mybatis (0)
- 数据库-通用 (8)
- 数据库-oracle (20)
- nosql-redis (11)
- nosql-mongoDB (1)
- xml (2)
- log4j (2)
- uml (3)
- web services: soap/wsdl (6)
- soa-tuscany (2)
- linux (6)
- ----------修养----------- (0)
- 深入理解java虚拟机 (7)
- java 设计模式 (9)
- 数据结构和算法 (2)
- 读书笔记--代码整洁之道 (2)
- 计算机基础 (1)
- -----------践行---------- (0)
- 重构(refactor) (7)
- jvm-诊断 (4)
- 数据库-让oracle跑得更快 (7)
- Nginx (6)
- ehcache (2)
- 短信开发 (1)
- Servlet+Filter+Listener (2)
- 运维 (6)
- 问题记录 (38)
- 杂七杂八 (12)
最新评论
-
zhanggang807:
第二种方法比较好
<spring> 定时任务每次都执行两次的问题,慎用new ClassPathXmlApplicationContext() -
assasszt:
谢谢分享,很清楚的讲明了原理。
字符集与字符编码简介 -
su0nils000:
难得的笔记
<进阶-2> 打造高效正则表达式 -
足至迹留:
mini188 写道用MD5来解决碰撞是不是也是可行的呢?个人 ...
Hash简介 -
mini188:
用MD5来解决碰撞是不是也是可行的呢?
Hash简介
6.1 什么是并发控制
并发控制(concurrency control)是数据库提供的函数集合,允许多个人同时访问和修改数据。前面说过,锁是oracle管理共享数据库资源并发访问并阻止并发数据库事务之间“相互干涉”的核心机制之一。总结一下,oracle使用了多种锁,包括如下几种类型:
TX(事务处理锁),TM(DML队列)锁和DDL锁,latch和Mutex。
不论是哪种锁,请求锁时都存在最小开销。TX事务锁在性能和基数方面可扩展性极好。TM锁和DDL锁要尽可能地采用限制最小的模式。Latch和队列锁都是轻量级的,而且都很快。如果应用设计不当,锁定的时间过长,而导致数据库中出现阻塞,就会带来问题。
但是oracle对并发的支持不只是高效的锁定。它还实现了一种多版本控制(multi-versioning)体系结构,这种体系结构提供了一种受控但高度并发的数据访问。多版本控制是指oracle能同时物化多个版本的数据,这也是oracle提供数据读一致视图(即相对于某个时间点有一致的结果)的机制。"读一致性"反映了一个事实:Oracle中的查询会从某个一致的时间点开始返回,查询使用的每个块都从同一个时间点开始,即使它在你执行查询时被修改或锁定。多版本控制有一个相当令人惊喜的连带效果,即数据的读取器绝对不会被数据的写入器所阻塞。它不会与其他会话发生死锁,而且不可能得到数据库中根本不存在的答案。
注意:在分布式两阶段提交的处理期间,在很短的一段时间内oracle不允许读信息。这种处理相当少见,只有当查询在准备阶段和提交阶段之间开始,而且视图在提交之前读取数据,此时才会存在这个问题,所以这里不详细介绍这种情况。
默认情况下,oracle的读一致性多版本模型应用于语句级,也就是说应用于每一个查询;另外还可以应用于事务级。这说明,至少提交到数据库的每一条sql语句都会看到数据库的一个读一致视图,如果你希望数据库的这种读一致视图是事务级的也是可以的。
数据库中事务的基本作用是将数据库从一种一致状态转变为另一种一致状态。ISO SQL标准指定了多种事务隔离级别(transaction isolation level),这些隔离级别定义了一个事务对其他事务做出的修改有多敏感。越是敏感,数据库在应用执行的各个事务之间必须提供的隔离程度就越高。
6.2 事务隔离级别
ANSI/ISO SQL标准定义了4种事务隔离级别,对于相同的事务,采用不同的隔离级别分别有不同的结果。也就是说,即使输入相同,而且采用同样的方式来完成同样的工作,也可能得到完全不同的答案,这取决于事务的隔离级别。这些隔离级别是根据3个现象定义的,以下就是给定隔离级别可能允许或不允许的3种现象:
1. 脏读(dirty read):你能读取未提交的数据,也就是脏数据。只要打开别人正在读写的一个os文件,就可以达到脏读的效果。如果允许脏读,将影响数据完整性,另外外键约束会遭到破坏,而且会忽略唯一性约束。
2. 不可重复读(nonrepeatable read):这意味着,如果你在T1时间读取某一行,在T2时间重新读取这一行时,这一行可能已经有所修改。也许它已经消失,也可能被更新了,等等。
3. 幻像读(phantom read):这说明,如果你在T1时间执行一个查询,而在T2时间再执行这个查询,此时可能已经向数据库中增加了另外的行,这会影响你的结果。与不可重复读的区别在于:在幻象读中,已经读取的数据不会改变,只是与以前相比,会有更多的数据满足你的查询条件。
Sql隔离级别是根据以下原则定义的,即是否允许上述各个现象。
Oracle明确地支持read committed和serializable隔离级别。Sql标准视图建立多种隔离级别,从而允许在各个级别上完成的查询有不同程度的一致性。Repeatable read也是sql标准定义的一个隔离级别,可以保证由查询得到读一致的结果。Read committed不能提供一致的结果,而read uncommitted级别用来得到非阻塞读。
不过在oracle中,read committed则有得到读一致查询所需的所有属性。在许多其他数据库中,read committed查询可能返回数据库中根本不存在的答案(即实际上任何时间点上都有这样的结果)。另外,oracle还秉承了read uncommitted的精神。有些数据库提供脏读的目的是为了支持非阻塞读,不过,oracle不需要脏读来达到这个目的,而且也不支持脏读。但在其他数据库中必须实现脏读来提供非阻塞读。
除了4个已定义的sql隔离级别外,oracle还提供了另外一个级别,称为read only。read only事务相当于无法在sql中完成任何修改的repeatable read或serializable事务。
6.2.1 read uncommitted
此隔离级别允许脏读。Oracle没有利用脏读,甚至不允许脏读。Read uncommitted隔离级别的根本目标是提供一个基于标准的定义以支持非阻塞读。我们已经看到,oracle默认地就提供非阻塞读。
6.2.2 read committed
Read committed隔离级别是指事务只能读取数据库中已经提交的数据。这里没有脏读,不过可能有不可重复读(也就是说,在同一个事务中重新读取同一行可能返回不同的答案)和幻象读(与事务早期相比,查询不光能看到已经提交的行,还可能看到新插入的行)。在数据库应用中,read committed可能是最常用的隔离级别了,这也是oracle数据库的默认模式,很少看到使用其他的隔离级别。
如果在一条语句中查询了多行,除了oracle外,在几乎所有其他的数据库中,read committed隔离都可能退化得像脏读一样,这取决于具体的实现。
在oracle中,由于使用多版本和读一致查询,无论是使用read committed还是使用read uncommitted,查询得到的答案总是一致的。Oracle会按查询开始时数据的样子对已修改的数据进行重建,恢复其“本来面目”,因此会返回数据库在查询开始时的答案。
注意:不同的数据库尽管采用相同的隔离级别,而且在完全相同的环境中执行,仍有可能返回完全不同的答案。在oracle中,非阻塞读并没有以答案不正确作为代价。
6.2.3 repeatable read
Repeatable read的目标是提供这样一个隔离级别,它不仅能给出一致的正确答案,还能避免丢失更新。
1.得到一致的答案
如果隔离级别是repeatable read,从给定查询得到的结果相对于某个时间点来说应该是一致的。大多数数据库(不包括oracle)都通过使用低级的共享读锁来实现可重复读。共享读锁会防止其他会话修改我们已经读取的数据。当然,这会降低并发性。Oracle则采用了更具并发性的多版本模型来提供读一致的答案。
在oracle中,通过使用多版本控制,得到的答案相对于查询开始执行那个时间点是一致的。在其他数据库中通过使用共享读锁,可以得到相对于查询完成那个时间点一致的答案,也就是说,查询结果相对于我们得到答案的那一刻是一致的。但是共享读锁有一个副作用:数据的读取器和写入器可能而且经常相互死锁。
但是oracle从不使用共享读锁,oracle选择了多版本控制机制,尽管更难实现,但绝对更具并发性。
2.丢失更新:另一个可移植性问题
在采用共享读锁的数据库中,repeatable read的一个常见用途是防止丢失更新。因为,只要选择数据就会在上面加一个锁,数据一旦由一个事务读取,就不能被任何其他事务修改。但是等你把应用移植到一个没有使用共享读锁作为底层并发控制机制的数据库时,就会痛苦地发现与你预想的并不一样。
尽管听上去使用共享读锁好像不错,但必须记住,如果读取数据时在所有数据上都加共享读锁,这肯定会严重限制并发和修改。
6.2.4 serializable
一般认为这是最受限的隔离级别,但是它也提供了最高程度的隔离性。Serializable事务在一个环境中操作时,就好像没有别的用户在修改数据库中的数据一样。
Oracle中是这样实现serializable事务的:原本通常在语句级得到的读一致性现在可以扩展到事务级别。结果并非相对于语句开始的那个时间点一致,而是在事务开始的那一刻就固定了。换句话说,oracle使用undo段按事务开始时数据的原样来重建数据,而不是按语句开始时的样子重建。
这种隔离性是有代价的,可能会得到ora-08177错误(can’t serialize access for this transaction)。只要你试图更新某一行,而这一行自事务开始后已经修改,你就会得到这个消息。也就是当事务隔离级别为serializable,两个事务并发修改同一个对象,当前一个事务提交或回滚时,第二个事务会收到该错误。
6.2.5 read only
Read only事务与serializable事务很相似,唯一的区别是read only事务不允许修改,因此不会遇到ORA-08177错误。
并发控制(concurrency control)是数据库提供的函数集合,允许多个人同时访问和修改数据。前面说过,锁是oracle管理共享数据库资源并发访问并阻止并发数据库事务之间“相互干涉”的核心机制之一。总结一下,oracle使用了多种锁,包括如下几种类型:
TX(事务处理锁),TM(DML队列)锁和DDL锁,latch和Mutex。
不论是哪种锁,请求锁时都存在最小开销。TX事务锁在性能和基数方面可扩展性极好。TM锁和DDL锁要尽可能地采用限制最小的模式。Latch和队列锁都是轻量级的,而且都很快。如果应用设计不当,锁定的时间过长,而导致数据库中出现阻塞,就会带来问题。
但是oracle对并发的支持不只是高效的锁定。它还实现了一种多版本控制(multi-versioning)体系结构,这种体系结构提供了一种受控但高度并发的数据访问。多版本控制是指oracle能同时物化多个版本的数据,这也是oracle提供数据读一致视图(即相对于某个时间点有一致的结果)的机制。"读一致性"反映了一个事实:Oracle中的查询会从某个一致的时间点开始返回,查询使用的每个块都从同一个时间点开始,即使它在你执行查询时被修改或锁定。多版本控制有一个相当令人惊喜的连带效果,即数据的读取器绝对不会被数据的写入器所阻塞。它不会与其他会话发生死锁,而且不可能得到数据库中根本不存在的答案。
注意:在分布式两阶段提交的处理期间,在很短的一段时间内oracle不允许读信息。这种处理相当少见,只有当查询在准备阶段和提交阶段之间开始,而且视图在提交之前读取数据,此时才会存在这个问题,所以这里不详细介绍这种情况。
默认情况下,oracle的读一致性多版本模型应用于语句级,也就是说应用于每一个查询;另外还可以应用于事务级。这说明,至少提交到数据库的每一条sql语句都会看到数据库的一个读一致视图,如果你希望数据库的这种读一致视图是事务级的也是可以的。
数据库中事务的基本作用是将数据库从一种一致状态转变为另一种一致状态。ISO SQL标准指定了多种事务隔离级别(transaction isolation level),这些隔离级别定义了一个事务对其他事务做出的修改有多敏感。越是敏感,数据库在应用执行的各个事务之间必须提供的隔离程度就越高。
6.2 事务隔离级别
ANSI/ISO SQL标准定义了4种事务隔离级别,对于相同的事务,采用不同的隔离级别分别有不同的结果。也就是说,即使输入相同,而且采用同样的方式来完成同样的工作,也可能得到完全不同的答案,这取决于事务的隔离级别。这些隔离级别是根据3个现象定义的,以下就是给定隔离级别可能允许或不允许的3种现象:
1. 脏读(dirty read):你能读取未提交的数据,也就是脏数据。只要打开别人正在读写的一个os文件,就可以达到脏读的效果。如果允许脏读,将影响数据完整性,另外外键约束会遭到破坏,而且会忽略唯一性约束。
2. 不可重复读(nonrepeatable read):这意味着,如果你在T1时间读取某一行,在T2时间重新读取这一行时,这一行可能已经有所修改。也许它已经消失,也可能被更新了,等等。
3. 幻像读(phantom read):这说明,如果你在T1时间执行一个查询,而在T2时间再执行这个查询,此时可能已经向数据库中增加了另外的行,这会影响你的结果。与不可重复读的区别在于:在幻象读中,已经读取的数据不会改变,只是与以前相比,会有更多的数据满足你的查询条件。
Sql隔离级别是根据以下原则定义的,即是否允许上述各个现象。
Oracle明确地支持read committed和serializable隔离级别。Sql标准视图建立多种隔离级别,从而允许在各个级别上完成的查询有不同程度的一致性。Repeatable read也是sql标准定义的一个隔离级别,可以保证由查询得到读一致的结果。Read committed不能提供一致的结果,而read uncommitted级别用来得到非阻塞读。
不过在oracle中,read committed则有得到读一致查询所需的所有属性。在许多其他数据库中,read committed查询可能返回数据库中根本不存在的答案(即实际上任何时间点上都有这样的结果)。另外,oracle还秉承了read uncommitted的精神。有些数据库提供脏读的目的是为了支持非阻塞读,不过,oracle不需要脏读来达到这个目的,而且也不支持脏读。但在其他数据库中必须实现脏读来提供非阻塞读。
除了4个已定义的sql隔离级别外,oracle还提供了另外一个级别,称为read only。read only事务相当于无法在sql中完成任何修改的repeatable read或serializable事务。
6.2.1 read uncommitted
此隔离级别允许脏读。Oracle没有利用脏读,甚至不允许脏读。Read uncommitted隔离级别的根本目标是提供一个基于标准的定义以支持非阻塞读。我们已经看到,oracle默认地就提供非阻塞读。
6.2.2 read committed
Read committed隔离级别是指事务只能读取数据库中已经提交的数据。这里没有脏读,不过可能有不可重复读(也就是说,在同一个事务中重新读取同一行可能返回不同的答案)和幻象读(与事务早期相比,查询不光能看到已经提交的行,还可能看到新插入的行)。在数据库应用中,read committed可能是最常用的隔离级别了,这也是oracle数据库的默认模式,很少看到使用其他的隔离级别。
如果在一条语句中查询了多行,除了oracle外,在几乎所有其他的数据库中,read committed隔离都可能退化得像脏读一样,这取决于具体的实现。
在oracle中,由于使用多版本和读一致查询,无论是使用read committed还是使用read uncommitted,查询得到的答案总是一致的。Oracle会按查询开始时数据的样子对已修改的数据进行重建,恢复其“本来面目”,因此会返回数据库在查询开始时的答案。
注意:不同的数据库尽管采用相同的隔离级别,而且在完全相同的环境中执行,仍有可能返回完全不同的答案。在oracle中,非阻塞读并没有以答案不正确作为代价。
6.2.3 repeatable read
Repeatable read的目标是提供这样一个隔离级别,它不仅能给出一致的正确答案,还能避免丢失更新。
1.得到一致的答案
如果隔离级别是repeatable read,从给定查询得到的结果相对于某个时间点来说应该是一致的。大多数数据库(不包括oracle)都通过使用低级的共享读锁来实现可重复读。共享读锁会防止其他会话修改我们已经读取的数据。当然,这会降低并发性。Oracle则采用了更具并发性的多版本模型来提供读一致的答案。
在oracle中,通过使用多版本控制,得到的答案相对于查询开始执行那个时间点是一致的。在其他数据库中通过使用共享读锁,可以得到相对于查询完成那个时间点一致的答案,也就是说,查询结果相对于我们得到答案的那一刻是一致的。但是共享读锁有一个副作用:数据的读取器和写入器可能而且经常相互死锁。
但是oracle从不使用共享读锁,oracle选择了多版本控制机制,尽管更难实现,但绝对更具并发性。
2.丢失更新:另一个可移植性问题
在采用共享读锁的数据库中,repeatable read的一个常见用途是防止丢失更新。因为,只要选择数据就会在上面加一个锁,数据一旦由一个事务读取,就不能被任何其他事务修改。但是等你把应用移植到一个没有使用共享读锁作为底层并发控制机制的数据库时,就会痛苦地发现与你预想的并不一样。
尽管听上去使用共享读锁好像不错,但必须记住,如果读取数据时在所有数据上都加共享读锁,这肯定会严重限制并发和修改。
6.2.4 serializable
一般认为这是最受限的隔离级别,但是它也提供了最高程度的隔离性。Serializable事务在一个环境中操作时,就好像没有别的用户在修改数据库中的数据一样。
Oracle中是这样实现serializable事务的:原本通常在语句级得到的读一致性现在可以扩展到事务级别。结果并非相对于语句开始的那个时间点一致,而是在事务开始的那一刻就固定了。换句话说,oracle使用undo段按事务开始时数据的原样来重建数据,而不是按语句开始时的样子重建。
这种隔离性是有代价的,可能会得到ora-08177错误(can’t serialize access for this transaction)。只要你试图更新某一行,而这一行自事务开始后已经修改,你就会得到这个消息。也就是当事务隔离级别为serializable,两个事务并发修改同一个对象,当前一个事务提交或回滚时,第二个事务会收到该错误。
6.2.5 read only
Read only事务与serializable事务很相似,唯一的区别是read only事务不允许修改,因此不会遇到ORA-08177错误。
发表评论
-
<让oracle跑得更快-7> AWR性能报告
2015-03-01 22:45 2073AWR是oracle 10g下提供的一 ... -
<让oracle跑得更快-6> 绑定变量
2015-02-28 21:52 1197变量绑定是OLTP系统中一 ... -
<让oracle跑得更快-5> 执行计划
2015-02-28 21:48 1226如果要分析某条(不是整体性能,后面还会讲到awr报告,会再次说 ... -
<让oracle跑得更快-4> 优化器(optimizer)
2015-02-27 21:27 2008Oracle数据库中优化器(o ... -
<让oracle跑得更快-3> latch和等待
2015-02-27 21:18 1123经常有人把latch造成的 ... -
<让oracle跑得更快-2> 锁和阻塞
2015-02-26 22:24 11262.1 锁和阻塞 首先,注意区别并发(concurrency) ... -
<让oracle跑得更快-1> 引起数据库性能问题的因素
2015-02-26 22:04 1498此《让oracle跑得更快》 ... -
OLTP(联机事务处理)和OLAP(联机分析处理) 【转】
2015-02-12 14:13 1209做数据库优化时,一定要先了解数据库支撑的应用特点,不同类型的应 ... -
<oracle优化>(url收藏)
2015-02-11 22:18 7871. CBO & RBO Rule Based Opt ... -
<oracle-11> 数据类型
2015-02-08 20:06 2503选择一个正确的数据类 ... -
<oracle-10> 索引
2015-02-01 21:19 1984索引是应用设计和开发的一个重要方面。如果有太多的索引,修改(插 ... -
<oracle-9> 数据库表
2015-01-30 15:44 12799.1 表类型 Oracle主要有 ... -
<oracle-8> redo和undo
2015-01-26 22:23 1621本章介绍oracle数据库中 ... -
<oracle-7> 事务
2015-01-26 11:07 1516事务(transaction)是数 ... -
<oracle-5> 锁(lock)和闩(latch)
2015-01-07 21:11 2699开发多用户、数据库驱动的应用时,最大的难点之一是:一方面要力争 ... -
<oracle-4> oracle进程
2015-01-06 23:02 1361Oracle中的各个进程要完成某个特定的任务或一组任务,每个进 ... -
<oracle-3> 内存结构
2015-01-05 22:20 1513这一篇主要讨论oracle的3 ... -
<oracle-2> oracle文件
2014-12-22 20:57 1102与oracle实例相关的文件只有下面几种: 参数文件(para ... -
<Oracle-1> oracle体系结构概述
2014-12-21 22:02 1159本系列主要参考《Oracle ...
相关推荐
21.3并发控制 174 21.3.1查询当前通过身份验证的用户及其会话的SessionRegistry 176 22.匿名身份验证 177 22.1概述 177 22.2配置 178 22.3 AuthenticationTrustResolver 179 23. WebSocket安全 180 23.1 WebSocket...
/u02/app/oracle/admin/cams/udump<br> <br> 6 UTL_FILE_DIR 参数<br> UTL_FILE_DIR = *<br> UTL_FILE_DIR 参数指定一个或多个目录用于 Oracle 应用的文件 I/O 如备<br> 份数据到文件 在 CAMS 系统中将该值设置为 * ...
4<br><br>0008 为程序设置版本和帮助信息 4<br><br>0009 设置Windows应用程序启动窗体 5<br><br>0010 设置Web应用程序起始页 5<br><br>0011 如何设置程序的出错窗口 5<br><br>0012 如何进行程序调试 6<br>...
Oracle Concepts 中文版 (10g R2) 订阅 RSS<br> <br><br>--------------------------------------------------------------------------------<br><br> <br>Part I What Is Oracle? 第一部分 何为 Oracle? <br>...
synchronized:控制多个并发线程对共享数据的访问 throwsException:异常处理" Q0044 this&super的异同 "this :引用当前对象 super:引用当前对象的父类 使用情况: (1) super.variable //用来访问父类被隐藏的...
Oracle中使用锁进行并发控制
12 章,数据库及实例的启动与关闭 <br>Part III Oracle Database Features 第三部分 Oracle 数据库特性 <br>Chapter 13, Data Concurrency and Consistency 第 13 章,数据并发性与数据一致性 <br>Chapter 14, ...
250<br>实例170 电子相册屏幕保护程序 250<br>实例171 歌曲播放屏幕保护程序 251<br>第6章 文件系统 253<br>6.1 创建和删除文件 254<br>实例172 创建和删除文件夹 254<br>实例173 建立临时文件 255<br>...
同一个公众号可以配置多个@Weixin注解控制器类,其中只需要一个有其他4项配置就可以了,如果多个控制器类配置了其他4个配置项,如果相对应的配置项值不相同,启动阶段会报错。 不同微信公众号是通过@Weixin的value...
DB2和 Oracle的并发控制(锁)比较,详解说明。
oracle数据库的并发控制
DB2和 Oracle的并发控制(锁)比较 在实际的生产运行环境中,笔者在国内很多客户现场都看到开发人员和系统管理人员遇到很多有关于锁而引起的性能问题,进而被多次问起DB2和Oracle中锁的区别比较问题,笔者根据自己在...
Oracle之事务与并发控制PPT教案.pptx
2013 Oracle技术嘉年:MYSQL并发控制
该文档详述ORACLE悲观锁和乐观锁的使用,锁定策略的选择及ORACLE在处理锁升级所使用的锁定转换策略
ORACLE数据库并发访问控制机制及访问冲突的解决方法.pdf
8.1 并发控制概述 8.2 封锁 8.3 封锁协议 8.4 活锁和死锁 8.5 并发调度的可串行性 8.6 两段锁协议 8.7 封锁的粒度 8.8 Oracle的并发控制 8.9 小结
PowerBuilder_Oracle体系结构下的并发控制.pdf
Oracle9i的数据库管理, Oracle9i数据库对象的管理,Oracle9i数据库的安全性,Oracle9i数据库的完整性和并发控制等