`

数据库事务与隔离等级详解

阅读更多

事务(transaction)是数据库管理系统的执行单位,可以是一个数据库操作(如Select操作)或者是一组操作序列。事务ACID属性,即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。

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

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

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

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

 

事务隔离级别(transaction isolation levels):隔离级别就是对对事务并发控制的等级。ANSI/ ISO SQL将其分为串行化(SERIALIZABLE)、可重复读(REPEATABLE READ)、读已提交(READ COMMITED)、读未提交(READ UNCOMMITED)四个等级。为了实现隔离级别通常数据库采用锁(Lock)。一般在编程的时候只需要设置隔离等级,至于具体采用什么锁则由数据库来设置。首先介绍四种等级,然后举例解释后面三个等级(可重复读、读已提交、读未提交)中会出现的并发问题。

串行化(SERIALIZABLE):所有事务都一个接一个地串行执行,这样可以避免幻读(phantom reads)。对于基于锁来实现并发控制的数据库来说,串行化要求在执行范围查询(如选取年龄在10到30之间的用户)的时候,需要获取范围锁(range lock)。如果不是基于锁实现并发控制的数据库,则检查到有违反串行操作的事务时,需要滚回该事务。

可重复读(REPEATABLE READ):所有被Select获取的数据都不能被修改,这样就可以避免一个事务前后读取数据不一致的情况。但是却没有办法控制幻读,因为这个时候其他事务不能更改所选的数据,但是可以增加数据,因为前一个事务没有范围锁。

读已提交(READ COMMITED):被读取的数据可以被其他事务修改。这样就可能导致不可重复读。也就是说,事务的读取数据的时候获取读锁,但是读完之后立即释放(不需要等到事务结束),而写锁则是事务提交之后才释放。释放读锁之后,就可能被其他事物修改数据。该等级也是SQL Server默认的隔离等级。

读未提交(READ UNCOMMITED):这是最低的隔离等级,允许其他事务看到没有提交的数据。这种等级会导致脏读(Dirty Read)。

 

       例子:下面考察后面三种隔离等级对应的并发问题。假设有两个事务。事务1执行查询1,然后事务2执行查询2,然后提交,接下来事务1中的查询1再执行一次。查询基于以下表进行:

users
 
id
 name
 age
 
1
 Joe
 20
 
2
 Jill
 25
 

可重复读(幻读,phantom reads)
一个事务中先后各执行一次同一个查询,但是返回的结果集却不一样。发生这种情况是因为在执行Select操作的时候没有获取范围锁(Range Lock),导致其他事务仍然可以插入新的数据。

Transaction 1
 Transaction 2
 
/* Query 1 */SELECT * FROM usersWHERE age BETWEEN 10 AND 30; 
 
 
 /* Query 2 */INSERT INTO users VALUES ( 3, 'Bob', 27 );COMMIT;
/* Query 1 */SELECT * FROM usersWHERE age BETWEEN 10 AND 30; 
 

注意transaction 1对同一个查询语句(Query 1)执行了两次。 如果采用更高级别的隔离等级(即串行化)的话,那么前后两次查询应该返回同样的结果集。但是在可重复读隔离等级中却前后两次结果集不一样。但是为什么叫做可重复读等级呢?那是因为该等级解决了下面的不可重复读问题。

读已提交(不可重复读,Non-repeatable reads)
在采用锁来实现并发控制的数据库系统中,不可重复读是因为在执行Select操作的时候没有加读锁(read lock)。

Transaction 1
 Transaction 2
 
/* Query 1 */SELECT * FROM users WHERE id = 1; 
 
 
 /* Query 2 */UPDATE users SET age = 21 WHERE id = 1;COMMIT; 
/* Query 1 */SELECT * FROM users WHERE id = 1; 
 

在这个例子当中,Transaction 2提交成功,所以Transaction 1第二次将获取一个不同的age 值.在SERIALIZABLE和REPEATABLE READ隔离级别中,数据库应该返回同一个值。而在READ COMMITTED和READ UNCOMMITTED级别中数据库返回更新的值。这样就出现了不可重复读。

读未提交 (脏读,dirty reads)
如果一个事务2读取了另一个事务1修改的值,但是最后事务1滚回了,那么事务2就读取了一个脏数据,这也就是所谓的脏读。发生这种情况就是允许事务读取未提交的更新。

Transaction 1
 Transaction 2
 
/* Query 1 */SELECT * FROM users WHERE id = 1; 
 
 
 /* Query 2 */UPDATE users SET age = 21 WHERE id = 1;
/* Query 1 */SELECT * FROM users WHERE id = 1; 
 
  RollBack
 

 

综上述,可以等到下面的表格:

隔离等级
 脏读
 不可重复读
 幻读
 
读未提交
 YES
 YES
 YES
 
读已提交
 NO
 YES
 YES
 
可重复读
 NO
 NO
 YES
 
串行化
 NO
 NO
 NO
 

 

  参考:

Isolation (database systems):http://en.wikipedia.org/wiki/Isolation_%28computer_science%29

 


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/llmlx/archive/2008/04/11/2282978.aspx

分享到:
评论

相关推荐

    数据库事务与隔离技术

    数据库事务是确保数据库操作一致性的重要机制,它定义了一组数据库操作的边界,这些操作要么全部执行,要么全部不执行。事务通常包含四个基本属性,即原子性(Atomicity)、一致性(Consistency)、隔离性...

    MySQL数据库事务隔离级别详解

    MySQL数据库的事务隔离级别是数据库管理系统中用于控制事务处理中并发操作的重要机制。在多用户同时访问数据库的情况下,事务隔离级别能够确保数据的一致性和完整性,避免并发操作带来的各种问题,如脏读、不可重复...

    sql数据库事务机制详解

    ### SQL数据库事务机制详解 #### 事务的基本概念 在数据库管理中,事务是一个非常重要的概念。事务是指作为单个逻辑工作单元执行的一系列操作。它主要用于确保数据在更新过程中的完整性,特别是在同步发生的多步...

    数据库并发事务处理机制详解与代码实践

    通过理解事务的ACID特性、隔离级别和并发控制技术,开发者可以更有效地设计和优化数据库系统。提供的代码示例展示了如何在实际数据库操作中应用这些概念,帮助读者在实际开发中管理并发事务。 通过本文的深入探讨和...

    数据库事务隔离级别.docx

    ### 数据库事务隔离级别详解 #### 一、引言 在多用户共享的数据库系统中,为了保证数据的一致性和准确性,必须对并发事务进行控制。数据库事务隔离级别是用来管理多个事务之间相互影响的程度,主要解决的问题包括脏...

    sql数据库 事务机制详解

    【SQL数据库 事务机制详解】 在数据库管理中,事务(Transaction)是确保数据一致性、完整性和可靠性的核心机制。一个事务是由一系列数据库操作组成的逻辑工作单元,这些操作必须作为一个整体执行,要么全部成功,...

    数据库事务应用

    ### 数据库事务应用详解 #### 事务处理的重要性与ACID特性 事务处理是现代数据库管理系统(DBMS)中不可或缺的一部分,尤其对于那些涉及复杂业务逻辑、需要确保数据一致性和完整性的应用来说更是如此。事务处理的...

    MySQL事务隔离级别详解.docx

    MySQL事务隔离级别详解 事务概念是数据库并发操作的最小控制单位,它是包含了一组有序的数据库操作命令的序列。事务的特性包括原子性、一致性、隔离性和永久性。原子性是指事务包含的数据库操作命令要么都执行,...

    数据库开发与WebServer详解(pdf)

    5. **事务处理**:了解ACID(原子性、一致性、隔离性、持久性)属性,以及事务的提交、回滚和并发控制。 6. **数据库备份与恢复**:理解不同备份类型(如完整备份、增量备份和差异备份),以及恢复策略和灾难恢复...

    db2数据库事务日志

    ### DB2数据库事务日志详解及处理方法 #### 一、引言 在数据库管理领域,尤其是对于IBM DB2这样的大型关系型数据库管理系统而言,事务日志管理是至关重要的环节之一。事务日志用于记录数据库中的所有事务操作,确保...

    mysql_innoDB 事务与锁详解

    接下来,我们通过一个具体的示例来演示不同事务隔离级别下事务与事务之间的影响。假设有一个名为`account`的表,其结构如下: ```sql CREATE TABLE `account` ( `ID` int(11) NOT NULL AUTO_INCREMENT, `VACCOUNT...

    数据库事务

    ### 数据库事务与隔离级别详解 #### 一、引言 在现代软件开发中,数据库事务处理是一项核心技能。事务不仅关乎数据的一致性和完整性,还直接影响系统的性能和并发处理能力。本文将深入探讨数据库事务的基本概念、...

    innodb如何巧妙的实现事务隔离级别详解

    【MySQL InnoDB 事务隔离级别详解】 在数据库管理系统中,事务是确保数据一致性的重要机制,而InnoDB存储引擎则是MySQL中支持事务的主要引擎。事务的四大特性,即原子性(Atomicity)、一致性(Consistency)、隔离...

    spring编程式事务与声明式事务详解

    事务隔离级别 TransactionDefinition 接口中定义了五个表示隔离级别的常量: * TransactionDefinition.ISOLATION_DEFAULT:默认值,表示使用底层数据库的默认隔离级别 * TransactionDefinition.ISOLATION_READ_...

Global site tag (gtag.js) - Google Analytics