`
Fred_Han
  • 浏览: 144334 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

浅谈数据库事务

阅读更多

一、事务的定义

 

数据库事务(Database Transaction) ,是指作为单个逻辑工作单元执行的一系列操作。事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源。通过将一组相关操作组合为一个要么全部成功要么全部失败的单元,可以简化错误恢复并使应用程序更加可靠。一个逻辑工作单元要成为事务,必须满足所谓的ACID(原子性、一致性、隔离性和持久性)属性。

 

二、事务的特征

 

原子性:保证事务中的所有操作全部执行或全部不执行。例如执行转账事务,要么转账成功,要么失败。成功,则金额从转出帐户转入到目的帐户,并且两个帐户金额将发生相应的变化;失败,则两个账户的金额都不变。不会出现转出帐户扣了钱,而目的帐户没有收到钱的情况。


一致性:保证数据库始终保持数据的一致性——事务操作之前是一致的,事务操作之后也是一致的,不管事务成功与否。如上面的例子,转账之前和之后数据库都保持数据上的一致性。


隔离性:多个事务并发执行的话,结果应该与多个事务串行执行效果是一样的。显然最简单的隔离就是将所有事务都串行执行:先来先执行,一个事务执行完了才允许执行下一个。但这样数据库的效率低下,如:两个不同的事务只是读取同一批数据,这样完全可以并发进行。为了控制并发执行的效果就有了不同的隔离级别。下面将详细介绍。


持久性:持久性表示事物操作完成之后,对数据库的影响是持久的,即使数据库因故障而受到破坏,数据库也应该能够恢复。通常的实现方式是采用日志。

 

三、为何引入事务

1、数据完整性   

2、数据安全性   

3、充分利用系统资源,提高系统并发处理的能力

 

四、为什么需要对事务并发控制

 

更新丢失Lost update:两个事务都同时更新一行数据,但是第二个事务却中途失败退出,导致对数据的两个修改都失效了。


脏读Dirty Reads:一个事务开始读取了某行数据,但是另外一个事务已经更新了此数据但没有能够及时提交。这是相当危险的,因为很可能所有的操作都被回滚。


不可重复读Non-repeatable Reads:一个事务对同一行数据重复读取两次,但是却得到了不同的结果。
二次更新问题Second lost updates problem:无法重复读取的特例。有两个并发事务同时读取同一行数据,然后其中一个对它进行修改提交,而另一个也进行了修改提交。这就会造成第一次写操作失效。


不可重复读Phantom Reads:事务在操作过程中进行两次查询,第二次查询的结果包含了第一次查询中未出现的数据(这里并不要求两次查询的SQL语句相同)。这是因为在两次查询过程中有另外一个事务插入数据造成的。

 

五、数据库的隔离级别

 

为了兼顾并发效率和异常控制,在标准SQL规范中,定义了4个事务隔离级别,事务准备接受不一致数据的级别称为隔离级别。隔离级别是一个事务必须与其它事务进行隔离的程度。较低的隔离级别可以增加并发,但代价是降低数据的正确性。相反,较高的隔离级别可以确保数据的正确性,但可能对并发产生负面影响。应用程序要求的隔离级别确定了所使用的锁定行为:


Read Uncommitted:直译就是"读未提交",意思就是即使一个更新语句没有提交,但是别的事务可以读到这个改变.这是很不安全的.


Read Committed:直译就是"读提交",意思就是语句提交以后即执行了COMMIT以后别的事务就能读到这个改变.


Repeatable Read:直译就是"可以重复读",这是说在同一个事务里面先后执行同一个查询语句的时候,得到的结果是一样的.


Serializable:直译就是"序列化",意思是说这个事务执行的时候不允许别的事务并发执行.

 

六,隔离级别与锁

 

隔离级别越高越能保证数据完整性和一致性,但是对并发性能影响也越大。
对于多数应用程序,可以优先考虑把数据库系统隔离级别设为Read Committed ,它能够避免脏读取而且具有较好并发性能。
尽管它会导致不可重复读、虚读和第二类丢失更新这些并发问题,在可能出现这类问题的个别场合,可以由应用程序采用悲观锁或乐观锁来控制 。
锁(Lock) 是在多用户环境下对资源访问的一种限制。机制当对一个数据源加锁后,
此数据源就有了一定的访问限制。我们就称对此数据源进行了“锁定”。
为了处理这些问题,SQL标准定义了以下几种事务隔离级别
READ UNCOMMITTED 幻想读、不可重复读和脏读都允许。
READ COMMITTED 允许幻想读、不可重复读,不允许脏读
REPEATABLE READ 允许幻想读,不允许不可重复读和脏读
SERIALIZABLE 幻想读、不可重复读和脏读都不允许


Oracle数据库支持READ COMMITTED 和 SERIALIZABLE这两种事务隔离级别。所以Oracle不支持脏读
SQL标准所定义的默认事务隔离级别是SERIALIZABLE,但是Oracle 默认使用的是READ COMMITTED
设置隔离级别使用 SET TRANSACTION ISOLATION LEVEL [READ UNCOMMITTED|READ COMMITTED|REPEATABLE READ|SERIALIZABLE]

 

分享到:
评论

相关推荐

    浅谈数据库事务四大特性

    主要介绍了浅谈数据库事务四大特性,小编觉得挺不错的,这里分享给大家,供需要的朋友参考。

    浅谈数据库中事务处理和并发控制技术

    该文档主要浅谈了数据库事务处理和并发控制的技术,可以作为初学者的参考文档

    实时数据库系统的设计浅谈.docx

    实时数据库系统的设计浅谈全文共3页,当前为第1页。实时数据库系统的设计浅谈全文共3页,当前为第1页。实时数据库系统的设计浅谈 实时数据库系统的设计浅谈全文共3页,当前为第1页。 实时数据库系统的设计浅谈全文共...

    2020中国数据库技术大会PPT合集(77份).zip

    2020中国数据库技术大会PPT合集(77份)。 在线分析进入Fast Data...浅谈数据库服务和架构演讲 平安数据库开发质量管理实践 面向生产力的数据架构演进 每秒万级订单的数据库优化实践 流程IT数据库上云实践 等等文档

    浅谈oracle rac和分布式数据库的区别

    2.rac事务上没有协调的问题,而分布式数据库由于是多个库需要事务上的协调; 3.分布式数据库数据是分散存储在各个节点,但是设备一般都是廉价的设备,经常出现节点故障,不过对用户来说是透明的;.RAC是ORACLE集群...

    浅谈多媒体数据库体系结构 (2011年)

    多媒体数据库管理系统与传统的数据库系统一样,要提供对数据的管理、查询和事务处理等功能。除此之外,对于多媒体数据库管理系统必须要求它有独立于媒体的变化;由于其具有面向对象的特征,而往往需要根据不同的对象而 ...

    嵌入式系统/ARM技术中的浅谈事务管理器的事务恢复处理方案

    随来社会的进步,计算机的广泛应用,很多事务处理过程中事务的恢复工作一般依赖于计算机数据库管理系统,而事务管理器必须做好分布式事务处理的事务恢复处理。这需要做好二个阶段的工作:在正常的事务处理过程中,...

    MYSQL 浅谈MyISAM 存储引擎

    注意:如果你在数据库进行事务操作,但是事务无法成功,你就要看你的表引擎了,看这种引擎是否支持事务。 >> 下面请看innodb中的事务操作   > 存储结构:数据文件(.MYD),索引文件(.MYI)和结构文

    详解SQL Server中的事务与锁问题

    “浅谈SQL Server 事务与锁”这个专题共分两篇,上篇主讲事务及事务一致性问题,并简略的提及一下锁的种类和锁的控制级别。 下篇主讲SQL Server中的锁机制,锁控制级别和死锁的若干问题。 二 事务 1 何为事务  ...

    浅谈MySql的存储引擎(表类型)

    什么是MySql数据库 通常意义上,数据库也就是...目前,它可以提供的功能有:支持sql语言、子查询、存储过程、触发器、视图、索引、事务、锁、外键约束和影像复制等。在后期,我们会详细讲解这些功能。 同Oracle 和SQ

    浅谈领域模型驱动中表的设计方法

     层次 职责 表现层 提供服务、显示信息 领域层(业务逻辑) 逻辑、系统中真正的核心 数据源层 与数据库、消息系统、事务管理器及其他软件包通信分层基本原则领域层和数据源层绝对不要依赖于表现层;...

    浅谈oracle SCN机制

    在理解SCN之前,我们先看下oracle事务中的数据变化是如何写入数据文件的: 1、事务开始; 2、在buffer cache中找到需要的数据块,如果没有找到,则从数据文件中载入buffer cache中; 3、事务修改buffer cache的...

    浅谈MySQL存储引擎选择 InnoDB与MyISAM的优缺点分析

    下面先让我们回答一些问题: ◆你的数据库有外键吗? ◆你需要事务支持吗? ◆你需要全文索引吗? ◆你经常使用什么样的查询模式? ◆你的数据有多大? 思考上面这些问题可以让你找到合适的方向,但那并不是绝对的。如果...

    浅谈选择mysql存储引擎的标准

    InnoDB是MySQL的默认事务型引擎,它被设计用来处理大量的短期(short-lived)事务。除非有非常特别的原因需要使用其他的存储引擎,否则应该优先考虑InnoDB引擎。 建议使用MySQL5.5及以后的版本,因为这个版本及以后的...

    浅谈Python实现Apriori算法介绍

    导读: 随着大数据概念的火热,啤酒与尿布的故事广为人知。我们如何发现买啤酒的人往往也会买尿布这一规律?数据挖掘中的用于挖掘频繁项集和关联规则的Apriori算法可以告诉我们。本文首先对Apriori算法进行简介,...

    浅谈MySQL中四种常用存储引擎

    不支持事务、也不支持外键,优势是访问速度快,对事务完整性没有 要求或者以select,insert为主的应用基本上可以用这个引擎来创建表 支持3种不同的存储格式,分别是:静态表;动态表;压缩表 静态表:表中的字段都...

    浅谈php中mysql与mysqli的区别分析

    其次,mysqli封装了诸如事务等一些高级操作,同时封装了DB操作过程中的很多可用的方法。应用比较多的地方是 mysqli的事务。比如下面的示例:复制代码 代码如下:$mysqli = new mysqli(‘localhost’,’root’,”,’DB...

    浅谈InnoDB隔离模式的使用对MySQL性能造成的影响

    在这篇文章里我将讨论一个相关的主题 – InnoDB 事务隔离模式,还有它们与MVCC(多版本并发控制)的关系,以及它们是如何影响MySQL性能的。 MySQL手册提供了一个关于MySQL支持的事务隔离模式的恰当描述 – 在这里我...

Global site tag (gtag.js) - Google Analytics