`
humn_chou
  • 浏览: 23017 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

事物隔离机制

    博客分类:
  • Java
阅读更多
数据库并发操作存在的异常情况:并发事物中

1.更新丢失(Lost update):两个事务更新一行数据,但是第二事务却中途失败退出,导致对数据两个修改都失效了,这是[/size][size=x-large]系统没有执行任何锁操作,因此并发事务并没有被隔离开来
2.脏读取(Dirty Reads):一个事物开始读取了某行数据,但是另外一个事务已经更新了此数据但没有能够及时提交。这是相当危险,很可能所有操作都被回滚
3.不可重复读取(Non-repeatable Reads):一个事务对同一行数据重复读取两次,但是却得到了不同结果。例如在两次读取中途,有另外一个事务对该行数据进行了修改并提交
4.两次更新问题(Second lost updates problem):无法重复读取特例,有两个并发事务同时读取同一行数据,然后其中一个对它进行修改提交,而另一个也进行了修改提交,这就会造成第一次写操作失效
5.幻读(Plantom Reads):事务在操作过程中进行两次查询,第二次查询结果包含了第一次查询中未出现的数据,这是因为在两次查询过程中有另外一个事务插入数据造成的。
    为了避免上面的几种情况,在标准SQL规范中定义了4个事务隔离级别,不同隔离级别对事务处理不同:

1.Read Uncommitted(未提交读):允许脏读取,但不允许更新丢失,如果一个事务已经开始写数据,则另外一个数据则不允许同时进行写操作,但允许其他事务读此行数据。此隔离级别可以通过“排他写锁”实现。事务隔离级别最低,仅可保证不读取物理损坏的数据。与Read Committed隔离级相反,它允许读取已经被其他用户修改但尚未提交确定的数据

2.Read Committed(提交读):允许不可重复读取,但不允许脏读取。这可以通过“瞬间共享读锁”和“排他写锁”实现,读取数据的事务允许其他事务继续访问该行数据,但是未提交写事务将会禁止其他事务访问该行。SQL Server默认的级别。在此隔离级下,Select命令不会返回尚未提交的数据,也不能返回脏数据
3.Repeatable Read(可重复读取):禁止不可重复读取和脏读取。但是有时可能出现幻影数据,这可能通过“共享读锁”和“排他写锁”实现,读取数据事务将会禁止写事务(但允许读事务),写事务则禁止任何其他事务。在此隔离级别下,用Select命令读取的数据在整个命令执行过程中不会被更改。此选项会影响系统的效能,非必要情况最好不用此隔离级别
4.Serializable(可串行读):提供严格的事务隔离,它要求事务序列化执行,事务只能一个接着一个地执行,但不能并发执行。如果仅仅通过“行级锁”是无法实现事务序列化的,必须通过其他机制保证新插入的数据不会被刚执行查询操作事务访问到。事务隔离的最高级别,事务之间完全隔离。如果事务在可串行读隔离级别上运行,则可以保证任何并发重叠事务均是串行的。
隔离级别     更新丢失     脏读取     重复读取     幻读

未提交读        N                   Y               Y                Y

提交读            N                   N              Y                Y

可重复读        N                   N              N                Y

串行                N                   N              N                N



-----------------------------来之网络 注意留看

事务并发处理(面试的意义更大)

a ) 事务 ACID

        i        atomic   Consistency   Itegrity   Durability 

              原子   一致 独立 持久

b )   事务并发时可能出现的问题

             第一类丢失更新(Lost Update)

            时间       取款事务A                           存款事务B

           T1           开始事务                   

           T2                                                       开始事务

            T3            查询账户余额为1000元    

           T4                                                        查询账户余额为1000元

           T5                                                          汇入100元把余额改为1100元

            T6                                                         提交事务

            T7     取出100元把余额改为900

            T8     撤销事务

           T9      余额恢复为1000元(丢失更新)


         ii      dirty read 脏读

         iii      不可重复读 non-repeatable read

         Iv     second lost update problem 第二类丢失更新(不可重复读的特殊情况)


         V    phantom     read     幻读

     c)    数据库的事务隔离机制

           i 查看java.sql.Connection文档

           ii 1   read - uncommitted 2: read - committed 4: repeatable read 8: serializable

                a)     0001       0010    0100    1000

               b) c                 R             U    D

    c)    c | u       0101

              d)       0101 &     0001 == 0001

                  2 只要数据库支持事务,就不可能出现第一类丢失更新

                  3 read - uncommitted 会出现dirty read , phantom- read , non -repeatable   read 问题

                  4   read - uncommitted 会出现 dirty read, 因为只有另一个事务提交才会读出来结果,但仍然会出现non- repeatable read ,   和phantom- read

                 5 repeatable read

                 6     serial      解决一切问题

             d)     设定hibernate 的事务隔离级别

                   i            hibernate.connection.isolation = 2

                   ii           用悲观锁解决 repeatable read 的问题(依赖于数据库的锁)

                               1    select …… for   update

                                2      load (** .class , i , LockMode. Update)

                                   a)    LockMode None 无锁的机制 ,Transaction结束时,切换到此模式

                                   B)LockMode. read 在查询时hibernate 会自动获取锁

                                    c ) LockMode.write insert update hibernate 会自动获取锁

                                   d )以上3种锁的模式,是hibernate 内部使用的

                                   e ) LockMode UPGRADE_ NOWAIT     ORACLE 支持的锁的方式
分享到:
评论

相关推荐

    06-VIP-深入理解Mysql事务隔离级别与锁机制.pdf

    这些问题都是由于多事务并发执行引起的,需要通过事务隔离机制和锁机制来解决。 事务隔离级别 数据库的事务隔离级别是用来解决读一致性问题的,常见的隔离级别有Read Uncommitted、Read Committed、Repeatable Read...

    SQLSERVER事务隔离级别的实验研究.pdf

    本研究为中国工程物理研究院工学院的课题研究提供了参考和指导,通过对SQL Server事务隔离级别的实验研究,有助于理解和掌握多用户并发数据库系统中的事务隔离机制,为数据库设计和应用开发提供了科学依据。...

    57 停一停脚步:梳理一下数据库的多事务并发运行的隔离机制l.pdf

    了解了数据库的事务隔离机制后,接下来需要了解的是锁机制。锁机制是为了在多个事务并发修改同一数据时,维护数据的一致性与完整性而设计的。锁可以分为共享锁和排他锁。共享锁允许多个事务并发读取数据,而排他锁则...

    msyql锁、事务隔离级别各种场景验证测试.rar

    这些问题的本质都是数据库的多事务并发问题,为了解决多事务并发问题,数据库设计了 事务隔离机制、锁机制、MVCC多版本并发控制隔离机制 ,用一整套机制来 解决多事务并发问题。 事务及其ACID属性 事务是由一组...

    行业-57 停一停脚步:梳理一下数据库的多事务并发运行的隔离机制l.rar

    事务的并发运行可能会导致数据不一致,因此,数据库系统提供了事务隔离机制来确保数据的一致性和完整性。本篇文章将深入探讨数据库中的多事务并发运行的隔离机制。 事务是数据库操作的基本单元,它通常包含一组...

    52 MySQL是如何支持4种事务隔离级别的?Spring事务注解是如何设置的?l.pdf

    总之,MySQL 的事务隔离机制允许用户根据需要选择合适级别的隔离,同时提供了 `SET TRANSACTION ISOLATION LEVEL` 命令和 Spring 的 `@Transactional` 注解来灵活配置,以保证数据的一致性和应用的性能。对于开发者...

    spring事务的传播特性和事务隔离级别

    ### Spring事务的传播特性和事务隔离级别 #### 一、Spring事务的传播特性(Propagation) 在Spring框架中,事务管理不仅提供了ACID属性的支持,还引入了事务的传播特性,这些特性决定了当一个方法调用另一个方法时,...

    详解Mysql事务隔离级别与锁机制.doc

    原子性是指事务是一个不可分割的操作单元,一致性是指事务在开始和完成时数据保持一致状态,隔离性是指数据库系统提供一定的隔离机制,保证事务在不受外部并发操作影响的“独立”环境执行,持久性是指事务完成之后,...

    SQLSERVER快照隔离

    快照隔离机制的优点是可以解决读取已提交事务隔离级别下的争用问题,提高系统的吞吐量和性能。同时,也可以减少锁定的使用,提高系统的可扩展性和可靠性。 然而,快照隔离机制也存在一些缺点。例如,需要付出一些...

    怎么理解SQL SERVER中事务隔离级别及相应封锁机制.pdf

    理解SQL Server中事务隔离级别及相应封锁机制 SQL Server中事务隔离级别是数据库管理系统中一个重要的概念,它决定了事务之间的并发执行和数据的一致性。本文将详细介绍SQL Server中事务隔离级别的概念、分类、特点...

    spring常用数据库事务传播属性和事务隔离级别1

    Spring 框架提供了一套完善的事务管理机制,其中包含了多种事务传播属性和事务隔离级别。这些特性使得在处理数据库操作时,能够更好地控制事务的边界和行为,从而确保数据的一致性和完整性。 首先,我们来看一下...

    事务并发访问及隔离机制

    事务并发带来的坏处,以及通过设置事务隔离级别来处理

    深入理解Mysql事务隔离级别与锁机制.pdf

    "深入理解Mysql事务隔离级别与锁机制" 事务隔离级别是数据库系统中的一种机制,用于解决多事务并发问题,使得事务之间的执行不受影响。这种机制可以分为四个级别:Read Uncommitted、Read Committed、Repeatable ...

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

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

    SQLserver锁和事务隔离级别的比较与使用

    SQL Server的锁机制和事务隔离级别是数据库管理系统中确保数据一致性、避免并发问题的重要机制。在SQL Server中,锁主要用于控制多个用户同时访问同一数据时的并发操作,而事务隔离级别则是确定在事务中如何处理这些...

    C# 事务处理机制

    在高并发环境下,为了确保事务隔离性,数据库管理系统通常会采用各种并发控制策略,如读已提交(Read Committed)、可重复读(Repeatable Read)、序列化(Serializable)等隔离级别。在C#中,可以设置...

    spring 事务传播与隔离级别DEMO

    总的来说,Spring的事务管理提供了一套灵活且强大的机制,帮助我们在多线程和分布式环境中保证数据一致性。通过学习和实践这个DEMO,开发者可以深化对事务处理的理解,从而提高系统的稳定性和可靠性。

    50 听起来很恐怖的数据库幻读,到底是个什么奇葩问题?l.pdf

    事务隔离机制允许我们控制并发事务之间的相互影响程度,它定义了几个不同的隔离级别,包括: - 读未提交(Read Uncommitted):最低的隔离级别,允许事务读取尚未提交的数据变更,可能会导致脏读、不可重复读和幻读...

    详解Hibernate事务处理机制

    Hibernate还允许开发者通过配置设置不同的事务隔离级别,以满足不同应用场景下的需求。常见的隔离级别包括: - `READ_UNCOMMITTED` - `READ_COMMITTED` - `REPEATABLE_READ` - `SERIALIZABLE` 这些级别的选择取决...

Global site tag (gtag.js) - Google Analytics