- 浏览: 128154 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
qindongliang1922:
不错!
linux sort 命令 -
eve:
这个还真没注意,8错
protected访问权限又理解了一下 -
imp860124:
学习了。
struts ActionForward跳转添加参数
事务不同引发的状况:
脏读(Dirty reads)
一个事务读取另一个事务尚未提交的修改时,产生脏读
很多数据库允许脏读以避免排它锁的竞争。
不可重复读(Nonrepeatable reads)
同一查询在同一事务中多次进行,由于其他提交事务所做的修改或删除,每次返回不同的结果集,此时发生非重复读。
幻读(Phantom reads)
同一查询在同一事务中多次进行,由于其他提交事务所做的插入操作,每次返回不同的结果集,此时发生幻像读。
数据库操作的隔离级别
未提交读(read uncommitted)
提交读(read committed)
重复读(repeatable read)
序列化(serializable)
oracle默认隔离级别read committed (statement level serialization)
每一个语句,在语句开始时,会获取一个此刻的数据快照。
一个事务有多条语句,如果语句之间存在其它完成的事务,
这可能引起不可持续读和幻读。
新建一个测试表books:
name,code,price三个字段
添加两条测试数据
使用pl/sql和java程序模拟并发
不允许脏读测试:
程序段首先查询code是qqq的书的价格
输出结果:price:15.0
然后pl/sql执行更新
!pl/sql设置成手动更新,不自动更新
在执行上面java查询代码
输出仍是price:15.0,说明读不到pl/sql中未提交的执行结果,即不允许脏读
pl/sql 执行
在执行java查询:
输出结果:price:18.0
会有不可重复读何幻读的现象发生就不用测试了吧,
这两种现象都是针对提交后事物的读引起的,read commited隔离级别是允许对提交后
的事物进行读的。
隔离级别:重复读(repeatable read)
这个不允许脏读,不可重复读,但是会有幻读现象。
这个oracle不支持,不好测试。
理解的话就是如果一条查询语句查询的内容有其它事物正在更新的时候,这
查询处于等待状态,直到先前事物提交更新后,才会执行本条查询。也就是
查询的时候也会有锁,需要等待并发的事物释放锁。然后自己获取到锁,执行
自己事物。这样查询也加锁,并发性更低
select ... for update 就是这样可以避免不可重复读的发生
隔离级别:serializable
这个就更严格了,事物执行是一个一个的。一个事务中的语句共享同一个数据快照(在事务开始时存在的数据)。
是事物级别的,脏读,不可重复读,幻读根本就没有机会发生。
前面像read committed都是语句级别的,以语句为单元。
比如
read committed一个事物A有a(select),b(select),c(update)三条语句
当A事物执行a,b的时候,若有B事物执行更新操作,是有可能的
因为a,b是不加锁的
写个例子:
上面执行的顺序,
事务B是在A的执行过程中执行的
脏读(Dirty reads)
一个事务读取另一个事务尚未提交的修改时,产生脏读
很多数据库允许脏读以避免排它锁的竞争。
不可重复读(Nonrepeatable reads)
同一查询在同一事务中多次进行,由于其他提交事务所做的修改或删除,每次返回不同的结果集,此时发生非重复读。
幻读(Phantom reads)
同一查询在同一事务中多次进行,由于其他提交事务所做的插入操作,每次返回不同的结果集,此时发生幻像读。
数据库操作的隔离级别
未提交读(read uncommitted)
提交读(read committed)
重复读(repeatable read)
序列化(serializable)
oracle默认隔离级别read committed (statement level serialization)
每一个语句,在语句开始时,会获取一个此刻的数据快照。
一个事务有多条语句,如果语句之间存在其它完成的事务,
这可能引起不可持续读和幻读。
新建一个测试表books:
name,code,price三个字段
添加两条测试数据
使用pl/sql和java程序模拟并发
不允许脏读测试:
程序段首先查询code是qqq的书的价格
//获取连接 省略 pstat = conn.prepareStatement("select price from books where code='qqq'"); rs = pstat.executeQuery(); while(rs.next()){ System.out.println("price:"+rs.getDouble(1)); } close();
输出结果:price:15.0
然后pl/sql执行更新
update books set price=18 where code='qqq';
!pl/sql设置成手动更新,不自动更新
在执行上面java查询代码
输出仍是price:15.0,说明读不到pl/sql中未提交的执行结果,即不允许脏读
pl/sql 执行
commit;
在执行java查询:
输出结果:price:18.0
会有不可重复读何幻读的现象发生就不用测试了吧,
这两种现象都是针对提交后事物的读引起的,read commited隔离级别是允许对提交后
的事物进行读的。
隔离级别:重复读(repeatable read)
这个不允许脏读,不可重复读,但是会有幻读现象。
这个oracle不支持,不好测试。
理解的话就是如果一条查询语句查询的内容有其它事物正在更新的时候,这
查询处于等待状态,直到先前事物提交更新后,才会执行本条查询。也就是
查询的时候也会有锁,需要等待并发的事物释放锁。然后自己获取到锁,执行
自己事物。这样查询也加锁,并发性更低
select ... for update 就是这样可以避免不可重复读的发生
隔离级别:serializable
这个就更严格了,事物执行是一个一个的。一个事务中的语句共享同一个数据快照(在事务开始时存在的数据)。
是事物级别的,脏读,不可重复读,幻读根本就没有机会发生。
前面像read committed都是语句级别的,以语句为单元。
比如
read committed一个事物A有a(select),b(select),c(update)三条语句
当A事物执行a,b的时候,若有B事物执行更新操作,是有可能的
因为a,b是不加锁的
写个例子:
//获取连接和关闭连接代码 省略 //不自动提交 conn.setAutoCommit(false); /** * a 查询 */ pstat = conn.prepareStatement("select price from books where code='qqq'"); rs = pstat.executeQuery(); while(rs.next()){ //输出 price:25.0 System.out.println("price:"+rs.getDouble(1)); } close(); /** * 暂停一会,用pl/sql执行B事务 * update books set price=15 where code='qqq'; * commit; */ Thread.sleep(10000); /** * 如果这里再执行a查询的话,和第一次查询结果就不一样,因为中间有B事务的提交更新 * 修改,这也是不可重复读 */ //b 更新 pstat = conn.prepareStatement("update books set price=price+10 where code='qqq'"); pstat.executeUpdate(); close(); //c 查询 pstat = conn.prepareStatement("select price from books where code='qqq'"); rs = pstat.executeQuery(); while(rs.next()){ //输出 还是price:25.0 ,因为B事务的干预 System.out.println("price:"+rs.getDouble(1)); } close(); //提交事务 conn.commit(); if(conn != null){ conn.close(); }
上面执行的顺序,
事务B是在A的执行过程中执行的
发表评论
-
oracle ORA-00257
2014-02-07 10:23 724ORA-00257表示oracle日志文件已满,需清理日志空间 ... -
oracle导入sql文件
2014-01-26 14:17 23481.oracle用户登录 或root下切换 :su - or ... -
oracle 处理死锁
2013-10-30 10:23 574需以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 2477--序列 /* 定义语法 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 2446--测试用表 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 1443数字函数 --输入和输出都是数字 --abs(x) 取绝 ... -
oracle sql
2011-08-22 17:41 0--union all --*select语句中列数量 ... -
oracle 数据库事务
2011-08-16 14:43 2196数据库事务: 事务: ... -
oracle 用户角色权限管理
2011-08-15 14:15 0select * from default_pwd$; ... -
oracle 存储过程和函数
2011-08-11 18:28 1320--子程序 /* 子程序是被命名的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 3794--触发器 trigger --1.DML触发器 DM ... -
oracle cursor (游标)
2011-08-10 12:22 2541--ref 游标 /* 显示游标 多行 ...
相关推荐
oracle 事务隔离级别 事务不同引发的状况: 脏读(Dirty reads) 一个事务读取另一个事务尚未提交的修改时,产生脏读 很多数据库允许脏读以避免排它锁的竞争。 不可重复读(Nonrepeatable reads) 同一查询在同一事务中...
介绍数据库事务的四种隔离级别,比较不同隔离级别的区别和影响
数据库事务和隔离级别
隔离级别定义了事务与事务之间的隔离程度。 隔离级别与并发性是互为矛盾的:隔离程度越高,数据库的并发性越差;隔离程度越低,数据库的并发性越好。
两个并发事务同时访问数据库表相同的行时,可能存在以下三个问题: 1、幻想读:事务T1读取一条指定where条件的语句,返回结果集。此时事务T2插入一行新记录,恰好满足T1的where条件。然后T1使用相同的条件再次查询,...
17.4事务的隔离级别 35 17.5数据库开发的关键挑战 35 17.6锁的概念 36 17.7 Oracle的锁机制 36 17.8事务不提交的后果 36 17.9回滚事务rollback 36 17.10保留点savepoint 36 十八、 数据库对象:视图view 37 18.1带子...
5.1.4 Oracle事务隔离级别 5.1.5锁管理器 5.2 RAC资源的协调和管理 5.2.1 Cache Fusion的结构 5.2.2 Cache Fusion工作原理 5.2.3 GES全局控制 5.3 RAC并发与一致性 5.3.1 DLM锁管理器 5.3.2多版本数据块 ...
数据库事务的四种隔离级别的特点描述,他们的使用热度,以及各种锁在隔离级别下的释放时机。
oracle并发和数据一致性的相关内容,针对数据库支持的4种隔离级别的说明
通过此文档,让你完全了解数据库事务与隔离技术,SQL SERVER,ORACLE在不同事务隔离级别的区别,以及两种数据库本身的特点
事务隔离级别是并发控制的整体解决方案,其实际上是综合利用各种类型的锁和行版本控制,来解决并发问题。锁是数据库并发控制的内部机制,是基础。对用户来说,只有当事务隔离级别无法解决一些并发问题和需求时,才有...
多租户容器数据库是指Oracle数据库管理模型的一种革新,它引入了容器数据库(CDB)和租户数据库(PDB)的概念。通过CDB和PDB模型,可以在一个数据库实例中同时管理多个独立的数据库,这些数据库彼此隔离,但又能共享...
Oracle中事务处理 –事务隔离级别 oracle的事务隔离级别 ORACLE提供了SQL92标准中的read committed和serializable,同时提供了非SQL92标准的read-only ◆ oracle的 read committed 说明: ①这是ORACLE缺省的...
2、Mysql提供了哪几种事务隔离级别? 3、MySQL中varchar与char的区别以及varchar(50)中的50代表的涵义? 4、date,datetime和timestamp数据类型有什么区别? 5、union 与union all的区别? 6、简述Mysql几种Join的...
另一个是新事务隔离级别(快照),增强系统" " " "的并发管理 " " " "支持在同一个硬件服务器上运行多个数据库实例 " " " "支持同一个实例上运行多个数据库,同一管理控制" " " "台完成所有管理工作,工具易于理解、...
在数据库操作中,为了有效保证并发读取数据的正确性,提出的事务隔离级别。数据库事务的隔离级别有4个,下面话不多说了,来一起看看详细的介绍吧。 数据库事务有四种隔离级别: 未提交读(Read Uncommitted):允许脏...