- 浏览: 128592 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
qindongliang1922:
不错!
linux sort 命令 -
eve:
这个还真没注意,8错
protected访问权限又理解了一下 -
imp860124:
学习了。
struts ActionForward跳转添加参数
数据库事务:
事务:逻辑工作单元,包含1至多条语句,要么全部成功,要么全部失败,
以commit结尾持久化更改或以rollback撤销操作
ACID 属性:
Atomic(原子性):
整个事务作为同一个单元要么全部成功要么全部失败。
Consistency(一致性):
事务中的操作保证数据库中的数据不会出现逻辑上不一致的情况,一致性一般会隐含的包括在其他属性之中。
Isolition(隔离性):
事务允许多个用户对统一数据进行那个并发访问,而不破坏数据的正确性和完整性。
同时,并行事务的修改必须与其他并行事务相互独立。由事务的锁来控制
Durabliity(持久性)
事务处理后,事务处理结果必须能够得到固化。
事务是多用户数据库和并发计划的基石。一旦一个事务提交成功,这个事务引起的变化将会变成
永久的,对其他事务是可见的。虽然很多事务执行时间很短,但是在事务提交成功前,事务引起的变化对
其他事务是无效的。所以每个事务必须隔离起来互不干涉(for 数据完整性)。实现这个的机制是锁。
锁:
1.write lock|exclusive lock
在事务执行过程中,排他锁被获取和应用,排他锁在commit||rollback执行是释放。排它锁同时只能被一个
用户获取,所以同时只有一个用户修改
2.read lock|shared lock
shared lock 可以同时被任意多的用户获取用来检索数据。
被加了共享说的数据在这个事务结束前不能加排他锁。其他数据智能读取数据不能修改。
oracle使用共享锁的情况是 select ... for update 语句,其它情况没有共享锁
---reference other:
共享锁(S锁)又称读锁,若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他事务只能再对A加
S锁,而不能加X锁,直到T释放A上的S锁。这保证了其他事务可以读A,但在T释放A上的S锁之前不能对A做任何
修改。
排他锁(X锁)又称写锁。若事务T对数据对象A加上X锁,事务T可以读A也可以修改A,其他事务不能再对A
加任何锁,直到T释放A上的锁。这保证了其他事务在T释放A上的锁之前不能再读取和修改A
并发和竞争
并发越多,锁之间的冲突就会有多,竞争就越多,性能就会下降。oracle使用multiversion read concurrency
scheme可以大大降低这种竞争。
数据完整性问题:
1.Lost updates
两个修改对同一个数据进行修改,a会覆盖b的修改数据(排他锁设计为了解决这个问题)
2.Dirty reads
数据库允许一个事务读取被另一事务修改的数据,但是这个事务所做的修改还为提交进行持久化,
这些修改可能会被回滚,所以这个数据读取的事务就是不正确的。很多数据库允许脏读以避免排它锁的竞争。
3.Nonrepeatable reads
其他事务修改数据的结果。一个事务特定的条件进行查询数据。在这个事务结束前,查询结果返回后,
另一个事务修改了数据,导致这些数据不再满足原来的查询条件,如果这个条件查询在执行一次,结果就不同。
4.Phantom reads 幻读
一个事务进行查询,在查询结果返回而这个事务结束前,另一事务插入一条新数据也符合前面的查询结果,这是
事务要根据查询结果尽心相应的修改就不准确 了。
Serialization 串行化
oracle多用户并发控制:multiversion read consistency(mvrc)
mvrc确保用户看到的他所需要的数据始终如一。如果另一个用户修改了这些数据,在这个用查询执行的过
程中。oracle会维护一个这个数据在查询开始时的数据版本,如果在查询开始的时候,这些修改数据的事务为提交
,oracle会确保忽视这些事务的修改。查询结果只会在查询开始时,已经提交的事务的基础上找。
1.oralce读数据不加任何锁
2.用户会得到一个完整的数据快照,不受其它事务干扰
oracle 隔离级别:
1.read commit:
statement level serialization
每一个语句,在语句开始时,会获取一个此刻的数据快照。一个事务有多条语句,如果语句之间存在其它完成的事务,
这可能引起不可持续读和幻读。oracle的默认隔离级别
2.serializable
transaction level:一个事务中的语句共享同一个数据快照(在事务开始时存在的数据)
3.read-only
Oracle Concurrency Features 并发特点
1.Rollback segments 回滚片段
回滚片段目的是为了事务回滚到事务前数据信息。当事务开始修改数据块时,首先会把这个时刻的数据快照
写入到rollback segment。rollback segment中的信息是回滚事务和多版本读取数据一致性的前提。
回滚片段不同于重做日志。重做日志是记录数据库所有的事务,当系统突然宕机的时候恢复数据库,
while the rollback segment provides rollback for transactions and read consistency。
回滚片段数据块缓存在系统全局区,就项表和索引一样。当rollback segment长时间不用时,可能从缓存中写到
磁盘。
2.System Change Number (SCN)
为了保证数据的完整性,保存数据库操作的顺序是至关重要的。oracle必须保证事务在时间上的执行顺序。
oracle实现这个的机制是SCN.
SCN是事件发生顺序的逻辑时间戳,oracle使用在重做日志中存储的SCN信息在原始数据上从新执行事务,以便
正确的进行重做。oracle同时也根据SCN决定什么时候清除不在需要的rollback segement信息。
3.Locks in data blocks
数据库必须有一种方式来确定特定行是否被锁定。大部分的数据库在内存中存储着一个锁的列表,这个列表被
一个锁管理进程维护。oracle将锁存放在具体的行信息存储的数据块区。对oracle数据库来说数据块是最小的可以从磁盘中
读取的数据单元,所以当行上有请求的时候,数据块被读取,块中存储的锁也便有效。行所对应的数据块的头部存有SCN信息。
oracle的这3个特点实现了multiversion read consistency(mvrc)。
select读取数据的时候:读取数据块,从块的头部信息获取SCN和当前SCN进行比较,如果当前SCN<块的SCN,那么就说明在
select开始后块的数据被修改过,再根据SCN找到其对应的事务的rollback segement获取旧的数据块值,递归的执行上面的
操作直到SCN小于当前的SCN。
oarcle并发操作控制过程 例子?
1.oracle 写并发 (A,B修改同一行)
(1).A发送一个update sql
(2).数据库获取这个sql的SCN,读取目标行所对应的数据块。
(3).数据库在这些数据块上加上锁标记
(4).数据库copy当前的数据快照到A事务的回滚片段中,完成后,数据库修改读取的缓存数据块中的数据(根据sql语句)
(5).数据库更新修改到A事务的回滚片段和数据库块中。
(6).B发送一个同样的update sql
(7).同2
(8).数据库从读取的数据块信息的header中发现,目标行上存在lock。下面的执行根据隔离级别执行:
如果B的隔离级别是READ COMMITTED,等待阻塞事务的执行完毕;如果B的隔离级别是SERIALIZABLE,error return。
(9).A提交事务。数据库执行相应的操作,发送确认信息给A
(10).如果B事务的隔离级别是READ COMMITED,B开始执行......
2.oracle 读、写并发
(1).Client A通过网络给数据库服务器发送一个select sql
(2).服务器获取这个sql的SCN,开始读取这个查询所需要的数据,对这个查询读取的每个数据块,服务器
都会比较这个select sql的SCN和数据块所在行上的任何未提交的事务的SCNS.如果服务器发现了一个未提交
事务的SCN号晚于select的SCN,那么数据库会使用这个事务回滚片段中的数据作为这个数据块的当前快照(select
语句开始时间)
(3).Client B向服务器发送一个update sql影响某一行目前还未被client A的select sql所读取。服务器生成这个
事务的SCN,开始操作
(4).Client B提交了修改。服务器完成了操作,写入了修改行数据到对应的数据块包含SCN号。
(5).Client A 查询读取到刚被B修改的行。发现了该行对应的数据块被SCN晚于select语句的SCN的事务修改过。
服务器查询这个数据块的头部信息(存有A事务的回滚片段,存有A事务开始时的数据快照),仍旧读取A事务开始时
的数据。B事务的修改被A忽略。
oracle悲观锁和乐观锁:
悲观锁:悲观的认为从取出数据到提交修改的过程中,别的用户会对该数据进行修改,会引发更新丢失,所以需要在取数据的
时候锁定数据行。
oracle使用select ...for update 锁定行,然后进行update...
乐观锁:乐观的认为从取出数据到提交修改,别的用户不会修改该数据,不需要在取出是就加锁。不依赖数据库的事务机制,不会
锁住任何东西,但是为了提交是能够判断是否有用户修改该数据,需要加时间戳或版本字段用来提交事务的时候判断是否
有事务修改数据,是否可以提交还是整个回滚。
事务:逻辑工作单元,包含1至多条语句,要么全部成功,要么全部失败,
以commit结尾持久化更改或以rollback撤销操作
ACID 属性:
Atomic(原子性):
整个事务作为同一个单元要么全部成功要么全部失败。
Consistency(一致性):
事务中的操作保证数据库中的数据不会出现逻辑上不一致的情况,一致性一般会隐含的包括在其他属性之中。
Isolition(隔离性):
事务允许多个用户对统一数据进行那个并发访问,而不破坏数据的正确性和完整性。
同时,并行事务的修改必须与其他并行事务相互独立。由事务的锁来控制
Durabliity(持久性)
事务处理后,事务处理结果必须能够得到固化。
事务是多用户数据库和并发计划的基石。一旦一个事务提交成功,这个事务引起的变化将会变成
永久的,对其他事务是可见的。虽然很多事务执行时间很短,但是在事务提交成功前,事务引起的变化对
其他事务是无效的。所以每个事务必须隔离起来互不干涉(for 数据完整性)。实现这个的机制是锁。
锁:
1.write lock|exclusive lock
在事务执行过程中,排他锁被获取和应用,排他锁在commit||rollback执行是释放。排它锁同时只能被一个
用户获取,所以同时只有一个用户修改
2.read lock|shared lock
shared lock 可以同时被任意多的用户获取用来检索数据。
被加了共享说的数据在这个事务结束前不能加排他锁。其他数据智能读取数据不能修改。
oracle使用共享锁的情况是 select ... for update 语句,其它情况没有共享锁
---reference other:
共享锁(S锁)又称读锁,若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他事务只能再对A加
S锁,而不能加X锁,直到T释放A上的S锁。这保证了其他事务可以读A,但在T释放A上的S锁之前不能对A做任何
修改。
排他锁(X锁)又称写锁。若事务T对数据对象A加上X锁,事务T可以读A也可以修改A,其他事务不能再对A
加任何锁,直到T释放A上的锁。这保证了其他事务在T释放A上的锁之前不能再读取和修改A
并发和竞争
并发越多,锁之间的冲突就会有多,竞争就越多,性能就会下降。oracle使用multiversion read concurrency
scheme可以大大降低这种竞争。
数据完整性问题:
1.Lost updates
两个修改对同一个数据进行修改,a会覆盖b的修改数据(排他锁设计为了解决这个问题)
2.Dirty reads
数据库允许一个事务读取被另一事务修改的数据,但是这个事务所做的修改还为提交进行持久化,
这些修改可能会被回滚,所以这个数据读取的事务就是不正确的。很多数据库允许脏读以避免排它锁的竞争。
3.Nonrepeatable reads
其他事务修改数据的结果。一个事务特定的条件进行查询数据。在这个事务结束前,查询结果返回后,
另一个事务修改了数据,导致这些数据不再满足原来的查询条件,如果这个条件查询在执行一次,结果就不同。
4.Phantom reads 幻读
一个事务进行查询,在查询结果返回而这个事务结束前,另一事务插入一条新数据也符合前面的查询结果,这是
事务要根据查询结果尽心相应的修改就不准确 了。
Serialization 串行化
oracle多用户并发控制:multiversion read consistency(mvrc)
mvrc确保用户看到的他所需要的数据始终如一。如果另一个用户修改了这些数据,在这个用查询执行的过
程中。oracle会维护一个这个数据在查询开始时的数据版本,如果在查询开始的时候,这些修改数据的事务为提交
,oracle会确保忽视这些事务的修改。查询结果只会在查询开始时,已经提交的事务的基础上找。
1.oralce读数据不加任何锁
2.用户会得到一个完整的数据快照,不受其它事务干扰
oracle 隔离级别:
1.read commit:
statement level serialization
每一个语句,在语句开始时,会获取一个此刻的数据快照。一个事务有多条语句,如果语句之间存在其它完成的事务,
这可能引起不可持续读和幻读。oracle的默认隔离级别
2.serializable
transaction level:一个事务中的语句共享同一个数据快照(在事务开始时存在的数据)
3.read-only
Oracle Concurrency Features 并发特点
1.Rollback segments 回滚片段
回滚片段目的是为了事务回滚到事务前数据信息。当事务开始修改数据块时,首先会把这个时刻的数据快照
写入到rollback segment。rollback segment中的信息是回滚事务和多版本读取数据一致性的前提。
回滚片段不同于重做日志。重做日志是记录数据库所有的事务,当系统突然宕机的时候恢复数据库,
while the rollback segment provides rollback for transactions and read consistency。
回滚片段数据块缓存在系统全局区,就项表和索引一样。当rollback segment长时间不用时,可能从缓存中写到
磁盘。
2.System Change Number (SCN)
为了保证数据的完整性,保存数据库操作的顺序是至关重要的。oracle必须保证事务在时间上的执行顺序。
oracle实现这个的机制是SCN.
SCN是事件发生顺序的逻辑时间戳,oracle使用在重做日志中存储的SCN信息在原始数据上从新执行事务,以便
正确的进行重做。oracle同时也根据SCN决定什么时候清除不在需要的rollback segement信息。
3.Locks in data blocks
数据库必须有一种方式来确定特定行是否被锁定。大部分的数据库在内存中存储着一个锁的列表,这个列表被
一个锁管理进程维护。oracle将锁存放在具体的行信息存储的数据块区。对oracle数据库来说数据块是最小的可以从磁盘中
读取的数据单元,所以当行上有请求的时候,数据块被读取,块中存储的锁也便有效。行所对应的数据块的头部存有SCN信息。
oracle的这3个特点实现了multiversion read consistency(mvrc)。
select读取数据的时候:读取数据块,从块的头部信息获取SCN和当前SCN进行比较,如果当前SCN<块的SCN,那么就说明在
select开始后块的数据被修改过,再根据SCN找到其对应的事务的rollback segement获取旧的数据块值,递归的执行上面的
操作直到SCN小于当前的SCN。
oarcle并发操作控制过程 例子?
1.oracle 写并发 (A,B修改同一行)
(1).A发送一个update sql
(2).数据库获取这个sql的SCN,读取目标行所对应的数据块。
(3).数据库在这些数据块上加上锁标记
(4).数据库copy当前的数据快照到A事务的回滚片段中,完成后,数据库修改读取的缓存数据块中的数据(根据sql语句)
(5).数据库更新修改到A事务的回滚片段和数据库块中。
(6).B发送一个同样的update sql
(7).同2
(8).数据库从读取的数据块信息的header中发现,目标行上存在lock。下面的执行根据隔离级别执行:
如果B的隔离级别是READ COMMITTED,等待阻塞事务的执行完毕;如果B的隔离级别是SERIALIZABLE,error return。
(9).A提交事务。数据库执行相应的操作,发送确认信息给A
(10).如果B事务的隔离级别是READ COMMITED,B开始执行......
2.oracle 读、写并发
(1).Client A通过网络给数据库服务器发送一个select sql
(2).服务器获取这个sql的SCN,开始读取这个查询所需要的数据,对这个查询读取的每个数据块,服务器
都会比较这个select sql的SCN和数据块所在行上的任何未提交的事务的SCNS.如果服务器发现了一个未提交
事务的SCN号晚于select的SCN,那么数据库会使用这个事务回滚片段中的数据作为这个数据块的当前快照(select
语句开始时间)
(3).Client B向服务器发送一个update sql影响某一行目前还未被client A的select sql所读取。服务器生成这个
事务的SCN,开始操作
(4).Client B提交了修改。服务器完成了操作,写入了修改行数据到对应的数据块包含SCN号。
(5).Client A 查询读取到刚被B修改的行。发现了该行对应的数据块被SCN晚于select语句的SCN的事务修改过。
服务器查询这个数据块的头部信息(存有A事务的回滚片段,存有A事务开始时的数据快照),仍旧读取A事务开始时
的数据。B事务的修改被A忽略。
oracle悲观锁和乐观锁:
悲观锁:悲观的认为从取出数据到提交修改的过程中,别的用户会对该数据进行修改,会引发更新丢失,所以需要在取数据的
时候锁定数据行。
oracle使用select ...for update 锁定行,然后进行update...
乐观锁:乐观的认为从取出数据到提交修改,别的用户不会修改该数据,不需要在取出是就加锁。不依赖数据库的事务机制,不会
锁住任何东西,但是为了提交是能够判断是否有用户修改该数据,需要加时间戳或版本字段用来提交事务的时候判断是否
有事务修改数据,是否可以提交还是整个回滚。
发表评论
-
oracle 数据库隔离级别
2014-04-29 17:46 1088事务不同引发的状况: 脏读(Dirty reads ... -
oracle ORA-00257
2014-02-07 10:23 730ORA-00257表示oracle日志文件已满,需清理日志空间 ... -
oracle导入sql文件
2014-01-26 14:17 23561.oracle用户登录 或root下切换 :su - or ... -
oracle 处理死锁
2013-10-30 10:23 581需以dba角色登录 --查询死锁的sql select sq ... -
oracle 数据库自增主键
2011-12-06 11:27 0oracle 自增走序列 当插入数据时,对具体的表定义ddl ... -
oracle 统计当前用户每个表的数据
2011-11-07 15:03 0declare CURSOR cs IS se ... -
oracle sequence ( 序列)
2011-10-21 15:31 2481--序列 /* 定义语法 CREATE SEQUE ... -
oracle table sequence
2011-10-21 13:09 0-- create table tab_1 ( t_id i ... -
oracle pl/sql递归查询
2011-10-13 12:00 2457--测试用表 create table xt( xti ... -
oracle 内建函数(二)——正则
2011-08-23 23:27 0--正则 --regexp_replace - ... -
oracle 内建函数二)--分析函数
2011-08-23 16:14 0--4.分组函数,avg(),count(),ma ... -
oracle 内建函数(一)
2011-08-23 12:01 1447数字函数 --输入和输出都是数字 --abs(x) 取绝 ... -
oracle sql
2011-08-22 17:41 0--union all --*select语句中列数量 ... -
oracle 用户角色权限管理
2011-08-15 14:15 0select * from default_pwd$; ... -
oracle 存储过程和函数
2011-08-11 18:28 1326--子程序 /* 子程序是被命名的PL/SQL块, ... -
oracle 异常处理
2011-08-09 16:55 0--异常 --预定义异常 pl/sql提供的系统例外 -- ... -
oracle 内置函数
2011-08-09 15:23 0--sql 函数 /* 单行函数:输入一行,输出一行 ... -
oracle 动态sql
2011-08-08 15:32 0--动态sql /* PL/SQL只认用户权限,不认角色 ... -
oracle trigger (触发器)
2011-08-08 11:55 3796--触发器 trigger --1.DML触发器 DM ... -
oracle cursor (游标)
2011-08-10 12:22 2548--ref 游标 /* 显示游标 多行 ...
相关推荐
ORACLE数据库事务处理和故障恢复
介绍了在 .NET 程序中使用数据库事务。如何创建 OracleTransaction 对象并用它们将事务提交给数据库,如何使用保存点部分回滚一个事务,以及 Oracle 数据库如何分离并发事务。同时分别提供了vb.net和c#两种开发工具...
在本文中,您将了解到如何在 Visual Basic .NET (VB.NET)和 Visual C# .NET(C#)中使用数据库事务。具体来讲,您将系统学习数据库事务、在 .NET 程序中使用 OracleTransaction 对象以及如何设置事务保存点。
ORACLe数据库讲义 简单介绍了Oracle的入门知识
数据库开发 Oracle数据库 SQL开发教程 第11章 数据操作与事务控制(共52页).pdf 数据库开发 Oracle数据库 SQL开发教程 第12章 Oracle数据库网络连接(共39页).pdf 数据库开发 Oracle数据库 SQL开发教程 第13章 ...
封装了对Oracle数据库的连接、增删改查、事务处理、查询直接得到数据集。使对数据库的操作变得很方便、简易
Oracle数据库,也被称为Oracle RDBMS或简称为Oracle,是甲骨文公司开发的一款关系数据库管理系统。它在数据库领域一直处于领先地位,是全球范围内流行的关系数据库管理系统。Oracle数据库系统以其良好的可移植性、...
数据库开发 Oracle数据库 SQL开发教程 第11章 数据操作与事务控制(共52页).pdf 数据库开发 Oracle数据库 SQL开发教程 第12章 Oracle数据库网络连接(共39页).pdf 数据库开发 Oracle数据库 SQL开发教程 第13章 ...
数据库开发 Oracle数据库 SQL开发教程 第11章 数据操作与事务控制(共52页).pdf 数据库开发 Oracle数据库 SQL开发教程 第12章 Oracle数据库网络连接(共39页).pdf 数据库开发 Oracle数据库 SQL开发教程 第13章 ...
第1章Oracle数据库概述 1.简答题 (1) 数据是描述事物的符号,是数据库中存储的基本对象。在计算机中,用记录的形式来描述数据。数据与数据的解释即数据的语义是紧密结合的。数据库是指按一定的数据模型组织、描述...
数据库开发 Oracle数据库 SQL开发教程 第11章 数据操作与事务控制(共52页).pdf 数据库开发 Oracle数据库 SQL开发教程 第12章 Oracle数据库网络连接(共39页).pdf 数据库开发 Oracle数据库 SQL开发教程 第13章 ...
数据库开发 Oracle数据库 SQL开发教程 第11章 数据操作与事务控制(共52页).pdf 数据库开发 Oracle数据库 SQL开发教程 第12章 Oracle数据库网络连接(共39页).pdf 数据库开发 Oracle数据库 SQL开发教程 第13章 ...
数据库开发 Oracle数据库 SQL开发教程 第11章 数据操作与事务控制(共52页).pdf 数据库开发 Oracle数据库 SQL开发教程 第12章 Oracle数据库网络连接(共39页).pdf 数据库开发 Oracle数据库 SQL开发教程 第13章 ...
完整版Oracle11数据库教程课件 第4章_修改数据及事务(共16页).ppt 完整版Oracle11数据库教程课件 第5章_表空间(共37页).ppt 完整版Oracle11数据库教程课件 第6章_创建表及约束(共39页).ppt 完整版Oracle11...
易语言oracle数据库连接模块源码,oracle数据库连接模块,置字符集,置dll路径,连接oracle数据库,取最后错误,释放句柄,断开服务器,执行sql_select,执行sql_非select,开始事务,提交事务,回滚事务,断开事务,取下个记录集,...
"监控Oracle数据库的常用shell脚本" 监控Oracle数据库的常用shell脚本是DBA日常工作中不可或缺的一部分。本文将分享8个常用的shell脚本,涵盖了数据库实例的可用性、监听器的可用性、表空间的使用情况、无效对象的...
数据库开发 Oracle数据库 SQL开发教程 第11章 数据操作与事务控制(共52页).pdf 数据库开发 Oracle数据库 SQL开发教程 第12章 Oracle数据库网络连接(共39页).pdf 数据库开发 Oracle数据库 SQL开发教程 第13章 ...
数据库开发 Oracle数据库 SQL开发教程 第11章 数据操作与事务控制(共52页).pdf 数据库开发 Oracle数据库 SQL开发教程 第12章 Oracle数据库网络连接(共39页).pdf 数据库开发 Oracle数据库 SQL开发教程 第13章 ...
数据库开发 Oracle数据库 SQL开发教程 第11章 数据操作与事务控制(共52页).pdf 数据库开发 Oracle数据库 SQL开发教程 第12章 Oracle数据库网络连接(共39页).pdf 数据库开发 Oracle数据库 SQL开发教程 第13章 ...
数据库开发 Oracle数据库 SQL开发教程 第11章 数据操作与事务控制(共52页).pdf 数据库开发 Oracle数据库 SQL开发教程 第12章 Oracle数据库网络连接(共39页).pdf 数据库开发 Oracle数据库 SQL开发教程 第13章 ...