脏读,不可重复读,幻读,丢失更新(乐观锁,悲观锁)

来源:互联网 发布:mysql dba是什么意思 编辑:程序博客网 时间:2024/05/21 19:35

        脏读:(dirty reads)

               脏读又称无效数据的读出,是指在数据库访问中,事务T1将某一值修改,然后事务T2读出该值,此后T1因为某种原因撤销对该值的修改,这就导致了T2所读到的数据是无效的。

               脏读是指当一个事务正在访问数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问了这个数据,然后使用了这个数据,因为这个数据是还没有提交的数据,那么另外一个事务读到的这个数据就是脏数据,依据脏数据所做的操作可能是不正确的。

              脏读(未提交读):防止一个事务读到另一个事务还没有提交的记录。

        不可重复读:(non-repetable reads)

            不可重复读:是指一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据,那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的数据可能是不一样的,这样就发生了在一个事务内两次读到的数据是不一样的,因此称为不可重复读。

         不可重复读的重点是修改:同样的条件,你读取过的数据,再次读取出来值就会不一样了。

        幻度:

            幻读是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行修改,这种修改涉及到表中的全部数据行,同时。第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据,那么,以后就会发生操作第一个事务的用户发现表中还没有修改的数据行,这就好像发生幻觉。

            幻读的重点在于新增或者删除:同样的条件,第一次和第二次读出来的记录数不一样。

       丢失更新(乐观锁,悲观锁):

           乐观锁:乐观锁机制采取了更加宽松的加锁机制。悲观锁大多数情况下不依靠数据库的锁机制实现,以保证操作最大程度的独占性,但随之而来的就是数据性能的大量开销,特别是对长事务而言。相对‘悲观而言,乐观的锁更倾向于开发运用,乐观锁大多是基于数据版本记录制实现。。

          优点:乐观锁机制避免了长事务中数据加锁开销(操作员A和B的操作过程都没有对数据库数据加锁)大大提升了大并发量下的系统整体性能体现。

          悲观锁:具有强烈的独占和排他性能,他指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度,因此,在整个数据处理过程中,将数据处于锁定状态,悲观锁的实现,往往依靠数据库提供的锁机制(只有数据库层提供的锁机制才能真正保证数据访问的排他性,否则,即使在本系统中实现了加锁机制,也无法保证外部系统不会修改数据)

          Spring声明式事务:

             Isolation属性一共支持五种事务机制:

                DEFAVLT使用数据库设置的隔离级别(默认),由DBA默认的设置来决定隔离级别。

                READ_UNCOMMITTED会出现脏读,不可重复读,幻读(隔离级别最低,并发性能最高) 

                READ_COMMITTED会出现不可重复读,幻读问题(锁定正在读取的行)

                REPEATABLE_READ会出幻读(锁定所读取的所有行)

               SERISLIZABLE保证所有的情况下不会发生(锁表)    


                         

阅读全文
0 0
原创粉丝点击