`
sangei
  • 浏览: 335724 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

(转)数据库事物、隔离等级及数据库锁机制

阅读更多

一、数据库事务的4个基本特征

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

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

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

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

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

二、数据库事物的隔离级别

      事务隔离级别(transaction isolation levels):隔离级别就是对对事务并发控制的等级。ANSIISO 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 users
WHERE age BETWEEN 10 AND 30;

 

 

/* Query 2 */
INSERT INTO users VALUES ( 3, 'Bob', 27 );
COMMIT;
/* Query 1 */
SELECT * FROM users
WHERE 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

三、锁的种类

数据库系统本身的锁机制

1、共享锁(Shared Lock)   select这种

2、更新锁(Update Lock)   update 这种

3、排他锁(Exclusive Lock):update set xx=c where id="3" 这种

4、意向锁(Intent Lock):对表进行加锁。

5、模式锁(Schema Lock):Altert table

6、批量更新锁(Bulk Update Lock):数据库备份恢复

业务级别上的锁机制,如Hibernated的锁机制:

  1. 悲观锁:利用数据库本身的锁机制实现。通过上面对数据库锁的了解,可以根据具体业务情况综合使用事务隔离级别与合理的手工指定锁的方式比如降低锁的粒度等减少并发等待。
  2. 乐观锁:利用程序处理并发。原理都比较好理解,基本一看即懂。方式大概有以下3种
    1. 对记录加版本号.
    2. 对记录加时间戳.
    3. 对将要更新的数据进行提前读取、事后对比。

不论是数据库系统本身的锁机制,还是乐观锁这种业务数据级别上的锁机制,本质上都是对状态位的读、写、判断。

分享到:
评论

相关推荐

    数据库中事物与锁的课件

    在数据库管理中,事务是确保数据一致性、完整性和并发控制的核心概念。事务是数据库系统执行一系列操作...了解并熟练掌握这些概念和机制对于数据库管理员和开发人员至关重要,以确保数据库系统的稳定性和数据的准确性。

    (事物学习笔记一) 对于数据库事物的理解

    在IT领域,数据库事务是确保数据一致性、完整性和原子性的重要机制。这篇“事物学习笔记一”主要聚焦于对数据库事务的理解,通过深入探讨其基本概念、特性以及在实际操作中的应用,帮助读者构建对这一核心概念的全面...

    数据库锁(行锁,表锁,共享锁,排他锁)脏读、不可重复读、幻读和事物隔离级别

    数据库锁是数据库管理系统中用于控制并发操作的重要机制,主要用于解决多用户环境下的数据一致性问题。在MySQL的InnoDB引擎中,支持行级锁(Row Locks)、表级锁(Table Locks),以及共享锁(Shared Locks)和排他...

    C#操作数据库事物使用

    此外,事务隔离级别(如读未提交、读已提交、可重复读和串行化)也是需要考虑的因素,不同的隔离级别会影响到并发性能和数据一致性。 总的来说,C#操作数据库事务是确保数据安全的关键技术。通过正确使用`...

    C# 数据库并发事物.doc

    总结来说,C#数据库并发事物处理涉及到对并发问题的理解、选择合适的锁机制(乐观锁或悲观锁)以及设定适当的数据库隔离级别。通过这些技术,开发者可以有效地解决多用户环境下的数据冲突,保证系统的稳定性和数据的...

    跨多个数据库操作,同时连接两个一上的数据库,用事物关联起来

    为了保证数据的一致性,我们需要一种机制来协调这些数据库间的操作,这就是"用事物关联起来"的关键。 事务(Transaction)是数据库操作的基本单元,它确保一组操作要么全部成功,要么全部失败,避免出现部分完成的...

    JMU数据库历年试卷.zip

    数据库是信息技术领域中的核心组成部分,它负责存储、管理和检索数据,是各类信息系统的基础。"JMU数据库历年试卷.zip"这个压缩包文件很可能包含了厦门集美大学(JMU)过去几年数据库课程的考试试题,对于学习数据库...

    Hibernate 事物隔离级别 深入探究

    在 Hibernate 中,事务隔离级别是指数据库系统提供的一种机制,以解决并发事务带来的问题。为了确保数据库的可靠性和一致性,Hibernate 提供了四种事务隔离级别,分别是 Serializable、Repeatable Read、Read ...

    spring事物隔离和传播机制

    ### Spring 事务隔离和传播机制详解 #### 一、Spring 事务传播机制 Spring 的事务管理功能非常强大,其中一个重要特性就是事务传播行为。事务传播行为定义了当一个方法调用另一个方法时,如何处理事务边界的问题。...

    SQL server 中锁机制详解

    锁饥饿问题:例如,事物 1 对记录施加了共享锁,事物 2 要更新数据,因此施加更新锁,并等待事务 1 完成后变为排它锁,在事务 2 等待时,事物 3 也在该位置放置了共享锁,然后事务 4 页放置了共享锁……这样下去事务...

    db2数据库培训课件

    DB2的事物隔离级别,包括表级锁定和行级锁定等,也是此部分的重点。 除了DB2性能优化的具体内容外,课件中还介绍了数据库发展历史,从1969年IBM开发的层次数据库IMS开始,到20世纪70年代IBM SystemR项目的确立和第...

    数据库原理与技术.zip

    8. **事物管理**:第八章讨论事务的概念,事务的ACID属性(原子性、一致性、隔离性和持久性),以及事务的提交、回滚和并发控制策略,如两阶段提交和锁机制。 这些章节内容构建了数据库理论和技术的坚实基础,对...

    川大数据库考试试题

    ### 数据库事物性质 1. **持久性**:指一旦事务提交,它对数据库所做的修改将会永久保存在数据库中,即使系统发生故障也不会丢失这些修改。 2. **原子性**:事务中的所有操作要么全部成功,要么全部失败,不会出现...

    数据库应用技术 答案.zip

    3. **ER模型和概念设计**:学习实体-关系(ER)模型,用于数据库的概念设计,如何将现实世界的事物抽象为实体,以及实体间的关系。 4. **关系数据库理论**:理解关系代数、关系演算和SQL语言,它们是查询和操作关系...

    数据库恢复技术.doc

    数据库恢复技术是数据库管理系统中的关键组成部分,其主要目标是确保数据库在各种故障情况下能够保持一致性和完整性。这一章深入探讨了事务和恢复子系统的重要概念。 事务是数据库操作的基本单元,它代表一系列逻辑...

    spring事物的7大传播机制,5个隔离机制

    这是PlatformTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别。具体取决于使用的数据库类型。 #### 2. ISOLATION_READ_UNCOMMITTED 最低级别的隔离级别,允许一个事务读取另一个事务未提交的数据...

    数据库系统概论(第四版)教材.pdf

    根据提供的文件信息,我们可以推断出这是一本关于数据库系统的教材书籍,名为《数据库系统概论》第四版,作者为王珊。此书是高等教育出版社出版的,主要面向高等院校的学生和教师,用作学习和教学数据库系统的基础...

    数据库事物

    数据库事物 1.事物的四大特性(ACID) 原子性:事物是最小的执行单位,不允许分割,事物的原子性确保动作要么全部完成,要么完全不起作用。 一致性:执行事物前后,数据保持一致,多个事物对同一个数据读取的结果是...

Global site tag (gtag.js) - Google Analytics