- 浏览: 131876 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
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 772ORA-00257表示oracle日志文件已满,需清理日志空间 ... -
oracle导入sql文件
2014-01-26 14:17 24001.oracle用户登录 或root下切换 :su - or ... -
oracle 处理死锁
2013-10-30 10:23 620需以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 2528--序列 /* 定义语法 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 2529--测试用表 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 1490数字函数 --输入和输出都是数字 --abs(x) 取绝 ... -
oracle sql
2011-08-22 17:41 0--union all --*select语句中列数量 ... -
oracle 数据库事务
2011-08-16 14:43 2233数据库事务: 事务: ... -
oracle 用户角色权限管理
2011-08-15 14:15 0select * from default_pwd$; ... -
oracle 存储过程和函数
2011-08-11 18:28 1356--子程序 /* 子程序是被命名的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 3842--触发器 trigger --1.DML触发器 DM ... -
oracle cursor (游标)
2011-08-10 12:22 2601--ref 游标 /* 显示游标 多行 ...
相关推荐
Oracle 数据库隔离级别是数据库事务处理中的核心概念,它决定了事务在并发环境下如何访问和处理数据,以确保数据的一致性和完整性。隔离级别主要解决的是并发操作中的脏读、不可重复读和幻读问题。 脏读(Dirty ...
### ORACLE的隔离级别 #### 一、概念理解 **隔离级别**定义了事务与事务之间的隔离程度。在多用户环境中,多个事务并发执行时,可能会出现一些问题,如更新丢失、脏读、非重复读和幻像读等。为了减少这些问题的...
介绍数据库事务的四种隔离级别,比较不同隔离级别的区别和影响
- 实现事务管理:提交、回滚和设置事务隔离级别。 - 使用存储过程和函数:调用数据库中的自定义逻辑。 - 数据源管理:通过连接池提高应用性能和资源利用率。 在J2EE应用服务器中,通常会配置数据源,这样应用可以...
8. **优化技巧**:包括使用PreparedStatement避免SQL注入,合理设置批处理大小,使用连接池,以及使用合适的事务隔离级别等。 9. **Quartz Job与Oracle结合**:`quartz_job.xml`可能定义了Quartz作业,这些作业可能...
数据库事务和隔离级别
Oracle数据库在Web开发中扮演着重要的角色,作为企业级数据存储和管理的首选平台,它提供了强大的功能和高效的数据处理能力。本指南将深入探讨如何将Oracle数据库与Web应用程序集成,实现数据的交互和管理。 一、...
Oracle数据库是全球广泛使用的大型关系型数据库管理系统之一,尤其在企业级应用中占据了重要的地位。本教程将带你深入了解Oracle数据库的基础知识,包括它的概念、架构、安装与配置、SQL语言的使用、表的创建和管理...
Oracle数据库是全球广泛使用的大型关系型数据库管理系统,其复杂而高效的设计使得它在企业级应用中占据了主导地位。本文将深入解析Oracle数据库的体系结构,帮助新手全面理解这个强大系统的内部运作。 首先,Oracle...
- **隔离机制**:了解不同的隔离级别及其对并发控制的影响。 - **锁机制**:学习如何使用锁来保证数据的一致性。 ##### 15. 优化 - **系统设计优化**:提高数据库性能的设计策略。 - **内存优化**:如何合理配置...
6. 事务和并发控制:Oracle提供了强大的事务管理和并发控制机制,如隔离级别、锁和多版本并发控制(MVCC)。书中的案例将帮助读者理解如何在多用户环境下确保数据的一致性和完整性。 7. PL/SQL编程:PL/SQL是Oracle...
此外,Oracle提供了多种隔离级别,以防止并发事务间的异常情况,如脏读、不可重复读和幻读。 数据库安全管理是另一个重要主题。Oracle提供角色、权限和对象权限机制来控制用户对数据库资源的访问。通过合理分配权限...
开发者需要掌握如何开始、提交、回滚事务,以及了解各种隔离级别对并发操作的影响。 五、性能调优 Oracle提供了许多工具和策略来优化数据库性能,如SQL Trace、 TKPROF、Automatic Workload Repository (AWR) 和 ...
7. **并发控制**:Oracle采用多版本并发控制(MVCC)来处理并发问题,通过读已提交(READ COMMITTED)、可重复读(REPEATABLE READ)和串行化(SERIALIZABLE)这三种事务隔离级别来确保数据的一致性。 8. **备份与...
9. **回滚段和事务管理**:优化回滚段的大小和数量,合理设置事务隔离级别,可以减少锁竞争,提高并发处理能力。 10. **监控与诊断工具**:如AWR(Automatic Workload Repository)、ASH(Active Session History)...
Oracle数据库的隔离级别是确保多用户环境下数据一致性、避免并发问题的关键机制。隔离级别定义了不同事务在执行过程中如何处理数据的可见性和并发操作。根据ANSI/ISO SQL92标准,有四种主要的隔离级别: 1. **未...
Oracle数据库的事务隔离级别是确保数据一致性的重要机制,它决定了在一个事务执行期间,与其他并行事务的交互方式。事务隔离级别主要解决并发操作时可能出现的三个问题:幻读(Phantom Read)、不可重复读(Non-...