事务的隔离级别

事务隔离超通俗好懂的的讲解

按照隔离的级别由低到高,越高的隔离,效率越差

  0)、DEFAULT 默认隔离级别,由数据库的数据隔离级别确定隔离级别
       1)、READ_UNCOMMIYTTED 都未提交的 级别最低
             允许别的事务,去读取这个事务为提交之前的数据
             缺点:可能会造成脏读、幻读、不可重复读。
             例子讲解:店家对1000元商品进行降价500处理,数据更改,但未提交事务;
             然后你查到降价将货物并提交订单; 可是商家由于操作异常,数据回滚,返回原价格1000;
             这样,在店家那边是没有操作成功的,可是在你这里却得到了降价货物订单。
             可理解为:外层更改价格的事务拉长执行,在执行之中出现提交订单的事情,你读了别人正在处理的数据。
               
      2)、READ_COMMITTED 读已提交级别     
             案例讲解:你原本查询商品价格为500,第二次为了证明真的降价了再查却发现并没有降价。

   缺点:两次读的都是真的(不脏读) 可是却存在不可重复
                    可以理解为: 你两次查询为一次事务,将此事务拉长;
                    在此事务中间,有更改价格的操作,可能执行了多次,可是在这个多次执行修改中你无法插进去查一次;
                    只能等他更改完(中间事务结束)才能进行下一次查询,你读的期间别人插进来对数据操作了
       两件事务出现了交集。

  3)、REPEATABLE_READ 可重复读    事务是多次读取,得到的相同的值。

   缺点: 会出现幻读
                  即该事务执行期间,不允许其他事务对该事务数据进行操作,保证该事物中多次对数据的查询结果一致。
             就是你多次查询的这个事务包含多条数据,为了保证读取的一致性,可重复读(REPEATABLE_READ)将使用的数据锁起来不让别人用。
                   
       4)、SERIALIZABLE 串行化读 将事务排序,逐个执行事务提交了之后才会继续执行下一个事务。

   缺点:都隔离开了,效率慢  
                 就是上面的可重复读(REPEATABLE_READ)是将使用的数据范围锁起来不让别人用,而这里是将涉及数据的表全都锁起来,不允许别人操作。
                 这个事务的执行中,别的事务连在旁边看的机会都没有,完全不会有影响,你读的时候别人看不到,隔离开,单独执行
      整个事务排队执行

 


问题的提出

编辑
数据库是要被广大客户所共享访问的,那么在 数据库操作过程中很可能出现以下几种不确定情况。

更新丢失

两个事务都同时更新一行数据,一个事务对数据的更新把另一个事务对数据的更新覆盖了。这是因为系统没有执行任何的锁操作,因此并发事务并没有被隔离开来。

脏读

一个事务读取到了另一个事务未提交的数据操作结果。这是相当危险的,因为很可能所有的操作都被 回滚

不可重复读

不可重复读(Non-repeatable Reads):一个事务对同一行数据重复读取两次,但是却得到了不同的结果。
包括以下情况:
(1) 虚读:事务T1读取某一数据后,事务T2对其做了修改,当事务T1再次读该数据时得到与前一次不同的值。
(2)  幻读(Phantom Reads):事务在操作过程中进行两次查询,第二次查询的结果包含了第一次查询中未出现的数据或者缺少了第一次查询中出现的数据(这里并不要求两次查询的 SQL语句相同)。这是因为在两次查询过程中有另外一个事务插入数据造成的。


为了避免上面出现的几种情况,在标准 SQL规范中,定义了4个事务隔离级别,不同的隔离级别对事务的处理不同。
未授权读取
也称为读未提交(Read Uncommitted):允许脏读取,但不允许更新丢失。如果一个事务已经开始写数据,则另外一个事务则不允许同时进行写操作,但允许其他事务读此行数据。该隔离级别可以通过“排他写锁”实现。
授权读取
也称为读提交(Read Committed):允许 不可重复读取,但不允许脏读取。这可以通过“瞬间共享读锁”和“排他写锁”实现。读取数据的事务允许其他事务继续访问该行数据,但是未提交的写事务将会禁止其他事务访问该行。
可重复读取(Repeatable Read)
可重复读取(Repeatable Read):禁止 不可重复读取和脏读取,但是有时可能出现幻读数据。这可以通过“共享读锁”和“排他写锁”实现。读取数据的事务将会禁止写事务(但允许读事务),写事务则禁止任何其他事务。
序列化(Serializable)
序列化(Serializable):提供严格的事务隔离。它要求事务 序列化执行,事务只能一个接着一个地执行,不能并发执行。仅仅通过“行级锁”是无法实现事务序列化的,必须通过其他机制保证新插入的数据不会被刚执行查询操作的事务访问到。
隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大。对于多数应用程序,可以优先考虑把 数据库系统的隔离级别设为Read Committed。它能够避免脏读取,而且具有较好的并发性能。尽管它会导致 不可重复读、幻读和第二类丢失更新这些并发问题,在可能出现这类问题的个别场合,可以由应用程序采用 悲观锁乐观锁来控制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值