先说点废话,这篇文章的第一段是2010年写的,因为包括懒在内的各种原因,一直没写完,今天第一次开始night shift.没啥事。把这个翻了出来。唉..... 本来一直想像coolshell那样。 等水平够了,发布的都是精品。 今天一想,大牛们都是靠积累出来的,皓哥也不是一生下来对编程有那么多见解。 先积累吧。 本来想写一些其它的,看着既然是10年的残篇,不如就把他继续写下去吧,无论文笔还是内容都无爆点,不过就把这当成一个开始吧。
——————————————我是可爱的分割线—————————————————————————
强烈为想学习oracle的朋友推荐一本书:oracle9i&10g编程艺术:深入数据库体系架构
先回顾一下事务的属性(简称ACID原则)
1.原子性(Atomicity) :一个事务应该是一个原子操作,要么成功,要么失败,不能存在部分成功部分失败的中间状态。
2.一致性(Consistency):事务无论成败不能破坏业务规则,必须使用系统从一个一致性状态到另一个一致性状态。例:银行转帐,A向B转1000元,事务完成之后,必须是A-1000 B+1000或AB余额不变,既事务前后都满足转帐规则 -- 双方余额之和不变。
3.隔离性(Isolation) :每个事务必须独立于其它事务执行。
4.持久性(Durability) :执行结果的值/状态持久。
之后再了解一下数据并发操作的三种误读
1.Dirty Read[脏读]
打开一个"别人"正读写的资源的数据。既能读到未提交的数据。
2.Nonrepeatable Read[不可重复读]
在一个原子操作中,时间点t1去读取一个值与时间点t2再次读取这个值发生了变化,可以是更新,删除。
3.Phantom Read[幻象读]
在时间点t1执行一个查询,得到的结果集与在时间点t2执行相同查询的结果集不一样,与不可重复读有点类似,不过不可重复读强调的同一个数据在随时间变化,而幻象读强调的是两次查询[结果集行数]增加。而不是指[数据值]的变化。
根据三种读允许出现的情况,正好可以划分ANSI/ISO SQL规定的四种隔离级别
隔离级别 |
脏读 |
不可重复读 |
幻像读 |
Read Uncommit(未提交读) |
允许 |
允许 |
允许 |
Read Commit(提交读) |
禁止 |
允许 |
允许 |
Repeatable Read(可重复读) |
禁止 |
禁止 |
允许 |
Serializable(串行读) |
禁止 |
禁止 |
禁止 |
注:oracle支持上面规定提交读与串行读之外还支持自身特殊的read-only只读事务
[未提交读]的[脏读]演示
时间点 |
事务 1 |
事务 2 |
t1 |
事务启动,向帐户A(无余额)存入1000元 |
|
t2 |
存入 |
查询余额 |
t3 |
(未提交) |
查询结果1000元 |
t4 |
回滚 |
|
这里演示的是[未提交读]出现[脏读]的情况,事实上未提交读也可以很"顺利"的出现不可重复读与幻像读,这里就不一一举例了。
未提交虽然有非阻塞的快速读写,但是它被认为是不可接受的事务级别,其真正原因并非在"读"上面(2 3两种级别仍然会出现误读的情况,但是他们被划为可接受的)。真正原因是因为未提交读完全破坏了ACID原则,不仅是展现(读)出来的数据有问题,更不能让人接受的是物理数据混乱(如果将上表中t2时的"查询余额"改成"网上购买支付1000元")以至业务规则被破坏。业务的成功与失败靠并发量决定,相信谁不会不接受。
[提交读]的[不可重复读]演示
时间点 |
统计在职员工平均工资 |
修改员工状态 |
t1 |
计算在职员工总工资 |
|
t2 |
(等待) |
开始事务,锁表,将其中一名在职员工的状态修改为[离职],提交. |
t3 |
计算在职员工总人数 |
|
t4 |
计算员工平均工资 |
|
|
*平均工资不正确,t1的查询到的
员工会比t3时查询到的多一个。
|
|
先说[提交读]的机制,提交读是指任何时候对表有写入操作时,对该表进行读操作都将阻塞,等待提交。这样就能避免脏读的出来。
这里展示的是[提交读]会引发的[不可重复读]的问题,可以这样理解不可重复读:假设那名离职职的员工叫张三, 在执行t1那条查询的时候, 张三的状态是在职,而在执行到t3的时候,此时张三的状态已经是离职了,也就是说在同一个事务中对同一个数据读两次,结果不一致(第二次不可重现第一次的查询到的值)。这就叫不可重复读。
这种隔离级别目前看来仍然是不被接受的,但是不会造成太多阻塞(相比后两种),效率也算较好。Oracle默认就是采用的这隔离级别,只过Oracle还在此基础上增加了[多版本控制]的机制(ps:这是一个天才的机制!),这让Oracle能尽可能的高效率,并且能保持事务间,数据的独立性。 感兴趣的朋友可以去看看, 就算不用oracle,当成一种解决方案来了解一下也不错。
[可重复读]的[幻像读]演示
时间点 |
统计在职员工平均工资 |
新录入一个员工 |
t1 |
计算所有员工的总工资
对[读到的行]增加一个共享读锁必须等到
该锁释放其它事务再能写操作,其它事务
的读操作不会阻塞
|
|
t2 |
(假设此时该线程没有得到CPU时间片) |
开启事务
新录入一个员工
提交
|
t3 |
计算在职员工的总人数 |
|
t4 |
计算员工的平均工资 |
|
|
*平均工资不正确,t3的查询到的
员工会比t1时查询到的多一个。
|
|
先说说[可重复读]隔离级别,在这种级别下,所有对行进行查询操作,都会给查询到的行上增加一下"共享读锁",锁这种锁锁到的行可以被其它事务查询,不会阻塞,但是如果是写操作的话,就必须要等到该锁释放后才能进行写入。如果将这种级别代入到之前的例子中,就不会出来不可重复读的问题。已锁数据无法修改。
但是[可重复读]隔离级别也有问题,他只会锁他所读到的行,不能控制新行的插入。上面的例子中,假设第一次算总工资时,人员是100人,还在计算员工总数时,就会是101人。这也会导致数据出现问题。一般我们叫这是幻像读。
串行读 这个没有什么可讲,所有的操作都会在一个队列中,一个一个的执行。是最严格的隔离级别。但是会造成极大的阻塞,所以在企业级系统中都不会用到,单用户的系统倒可以试试。
ps:上面说的是标准的四种隔离级别,不同数据库在实现的时候都会有些自己独特的地方,比如oracle就用的多版本控制,还额外提供了read-only隔离级别。
分享到:
相关推荐
从提供的文件内容中,我们可以提取与Access数据库相关的知识点。...由于内容是OCR扫描所得,其中可能会有误读或遗漏的情况,因此在实际应用这些知识点时可能需要参照标准的Access数据库教程或手册进行校验。
《高中语文选修语言文字应用迷幻陷阱——误读和异读》的PPT课件主要探讨了在语言学习中常见的误读和异读问题,这些情况常常在我们的日常交流和学习中出现,影响理解与表达的准确性。下面将详细阐述相关知识点。 ...
罗斯文2007数据库是一种基于Access 2007平台的数据管理工具,它提供了高效的数据存储、组织和分析功能,特别适合小型企业或个人用户使用。Access是Microsoft Office套件的一部分,允许用户创建自定义数据库应用程序...
根据所提供的文件内容,可以看出文档涉及的主题与数据库原理及应用相关,尤其是与Microsoft SQL Server 2005数据库管理系统有关。同时,文档中也提及了与数据库编程和设计相关的软件工具,例如VB (Visual Basic), VC...
本文将详细介绍如何在Linux环境下为Oracle数据库安装中文字体库,以确保正确显示中文字符。 首先,我们需要了解Oracle数据库对字体库的要求。Oracle数据库在显示非ASCII字符(如中文)时,需要依赖特定的字体文件。...
《互联网的误读》是一本关于互联网和技术的书籍,它详细地介绍了互联网的历史、现状和未来,以及互联网技术对社会、经济、政治等方面的影响。本书探讨了互联网的历史和现状,详细地介绍了互联网的起源和发展,以及...
在本节课程"Lec03_存储引擎_上1"中,主要探讨了数据库系统中的Page Header、事务可见性、数据压缩、Page Layout以及Tuple Layout等核心概念。 首先,Page Header是存储引擎管理数据库每一页的关键组成部分。它包含...
从给出的文件内容中可以提取的知识点主要包括了RS-232电平转换器的概述、型号及用途、性能参数和使用方法几个方面。以下是详细的知识点梳理: ### RS-232电平转换器概述 RS-232电平转换器是一种电子接口转换设备,...
根据提供的文件信息,可以看出标题与描述以及部分内容之间缺乏明确关联性,这可能是因为原始文档可能存在乱码或非标准...需要注意的是,由于原始数据可能存在误读或乱码的情况,在实际应用时还需进一步核实相关信息。
本文主要讨论的是《内经》原文在临床应用中可能出现的误读及其临床意义。以下是对标题和描述中涉及的一些关键知识点的详细解释: 1. **《素问·诊要经终论》误读**:原文提到“太阴气终者,腹胀,闭,不得息,善噫...
在Microsoft SQL Server中,数据库管理员经常需要获取数据库文件的相关信息,比如文件位置、大小、使用空间和可用空间等。这些信息对于数据库的日常维护和优化至关重要。SQL Server提供了系统视图和系统函数来帮助...
这个PPT文件名为“学高中语文选修语言文字应用迷幻陷阱——误读和异读PPT学习教案”,主要关注的是高中语文教学中关于语言文字应用的一个专题,特别是误读和异读的问题。误读通常指的是对汉字或词语的错误读音,而...
1. **误读与异读概念** - **误读**:指在语言交际中,由于字形相近、多音字混淆或方言影响等因素,导致的读音错误。 - **异读**:同一个字在不同语境或不同地区存在两种或多种读音,可能是由于文读(书面语)和白...
(英)詹姆斯·柯兰;互联网的误读(英)詹姆斯·柯兰
运行支配运行利益学说误读矫正.doc
中国资本市场—渐进与误读.docx
这篇文档主要列举了一些容易被误读的中文单音字,并要求为它们标注正确的读音。在中文中,一些汉字由于其多音字性质或者方言差异,可能会被读者误读。以下是一些关键的汉字及其常见读音: 1. 汗流浃背 (hàn liú ...
初中语文文摘社会别误读“食品添加剂”
这篇文档是关于中文中容易误读的单音字的总结,涵盖了多个领域的词汇,包括人物行为、自然现象、文化概念、情感表达等。这些词在日常使用中可能会因为发音相近或者字形相似而被混淆,因此正确掌握它们的读音至关重要...