精华内容
下载资源
问答
  • 数据库隔离级别详解

    千次阅读 2019-03-18 23:28:40
    之前,我们有讲过数据库的索引,链接为数据库索引详解今天,我们将讲解数据库隔离级别。 一、隔离级别种类与分别可以解决的问题: 事务的隔离级别分为4个,即 读未提交(read uncommitted)、读已提交(read ...

      之前,我们有讲过数据库的索引,链接为 数据库索引详解 今天,我们将讲解数据库的隔离级别。

    一、隔离级别的种类与分别可以解决的问题:

      事务的隔离级别分为4个,即 读未提交(read uncommitted)、读已提交(read committed)、可重复读(Repeatable read)、可串行化(Serializable)

     oracle默认的隔离级别为 读已提交。mysql的默认隔离级别为 可重复读。

     其中可以解决的问题如下表:

      简单来说:

      脏读即为session A读取到了session B中未提交的数据

      不可重复读即为session A读取到了session B提交的数据,即前后session A读取的数据不一致

      幻读即为session A读取到了session B insert的数据。

     

    二、隔离级别的设置与查询:

     1、设置隔离级别:

      设置隔离级别分为设置全局的隔离级别与设置当前的隔离级别

      全局设置,已存在的session不会生效,以后的新session会生效(以读未提交举例):

       set global transaction isolation level read uncommitted;

      单独设置当前连接:

        set session transaction isolation level read uncommitted;

     2 、查看当前隔离级别:

       select @tx_isolation;

     

    三、事务隔离级别的测试:

    有一个goods表,里面有id、count(商品数量)、brandId(品牌id)

    CREATE TABLE `goods` (
    
    `id` int(11) NOT NULL AUTO_INCREMENT,
    
    `count` int(11) DEFAULT '0',
    
    `brandId` int(11) DEFAULT '0',
    
    PRIMARY KEY (`id`),
    
    KEY `idx_brandId` (`brandId`)
    
    ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf-8;

    1、脏读(设置隔离级别为读未提交):

      脏读为读到其它事务未提交的数据:

    AB

    select * from goods where id = 1;

    返回1

     
     update goods set count = 2 where id = 1;

    select * from goods where id = 1;

    返回2

     
     commit;

    2、不可重复读(设置隔离级别为 读已提交)

      不可重复读为读到其它数据已提交的数据,即前后查询数据不一致

    AB

    select * from goods where id = 1;

    返回1

     
     update goods set count = 2 where id = 1;

    select * from goods where id = 1;

    返回1

     
     commit;

    select * from goods where id = 1;

    返回2

     

    3、幻读(设置隔离级别为 可重复读):

      幻读为读到别人已提交的写入数据库的数据。

      幻读与不可重复读的区别为幻读为读到新插入的数据(insert),而不可重复读主要是更改与删除(update、delete)。

      即不可重复读前后被其它session update、delete的数据没有问题,不会有变化,但是其它session insert的可能有变化。

    AB

    select * from goods where brandId = 1;

    返回有id为1,2的两条

     
     insert into goods (count,brandId) values (3, 1);
     commit;

    select * from goods where brandId = 1;

    返回有id为1,2,3的三条

     

    当隔离级别为 可串行化 的时候则不会出现上述问题。

     

     

     

     

    展开全文
  • 现在来看看MySQL数据库为我们提供的四种隔离级别: ① Serializable (串行化):可避免脏读、不可重复读、幻读的发生。 ② Repeatable read (可重复读):可避免脏读、不可重复读的发生。 ③ Read committed (读已...

    1.脏读 

    脏读是指在一个事务处理过程里读取了另一个未提交的事务中的数据。

    当一个事务正在多次修改某个数据,而在这个事务中这多次的修改都还未提交,这时一个并发的事务来访问该数据,就会造成两个事务得到的数据不一致。

    举个例子,A在一个转账事务中,转了100块钱给B,此时B读到了这个转账的数据,然后做了一些操作(发货给A,或者其他的),可是这时候A的事务并没有提交,如果A回滚了事务,那就GG了。这就是脏读了。

    2.不可重复读

    不可重复读是指在对于数据库中的某个数据,一个事务范围内多次查询却返回了不同的数据值,这是由于在查询间隔,被另一个事务修改并提交了。

      例如事务T1在读取某一数据,而事务T2立马修改了这个数据并且提交事务给数据库,事务T1再次读取该数据就得到了不同的结果,发送了不可重复读。

      不可重复读和脏读的区别是,脏读是某一事务读取了另一个事务未提交的脏数据,而不可重复读则是读取了前一事务提交的数据。

      在某些情况下,不可重复读并不是问题,比如我们多次查询某个数据当然以最后查询得到的结果为主。但在另一些情况下就有可能发生问题,例如对于同一个数据A和B依次查询就可能不同,A和B就可能打起来了……

    3.幻读

        幻读是事务非独立执行时发生的一种现象。例如事务T1对一个表中所有的行的某个数据项做了从“1”修改为“2”的操作,这时事务T2又对这个表中插入了一行数据项,而这个数据项的数值还是为“1”并且提交给数据库。而操作事务T1的用户如果再查看刚刚修改的数据,会发现还有一行没有修改,其实这行是从事务T2中添加的,就好像产生幻觉一样,这就是发生了幻读。

      幻读和不可重复读都是读取了另一条已经提交的事务(这点就脏读不同),所不同的是不可重复读查询的都是同一个数据项,而幻读针对的是一批数据整体(比如数据的个数)。

    现在来看看MySQL数据库为我们提供的四种隔离级别:

      ① Serializable (串行化):可避免脏读、不可重复读、幻读的发生。

      ② Repeatable read (可重复读):可避免脏读、不可重复读的发生。

      ③ Read committed (读已提交):可避免脏读的发生。

      ④ Read uncommitted (读未提交):最低级别,任何情况都无法保证。

      以上四种隔离级别最高的是Serializable级别,最低的是Read uncommitted级别,当然级别越高,执行效率就越低。像Serializable这样的级别,就是以锁表的方式(类似于Java多线程中的锁)使得其他的线程只能在锁外等待,所以平时选用何种隔离级别应该根据实际情况。在MySQL数据库中默认的隔离级别为Repeatable read (可重复读)

      在MySQL数据库中,支持上面四种隔离级别,默认的为Repeatable read (可重复读);而在Oracle数据库中,只支持Serializable (串行化)级别和Read committed (读已提交)这两种级别,其中默认的为Read committed级别。

    mysql 查询事务的隔离级别       
    select @@tx_isolation;

    在MySQL数据库中设置事务的隔离 级别:

        set  [glogal | session]  transaction isolation level 隔离级别名称;
        set tx_isolation=’隔离级别名称;’

    分类: 数据库

    展开全文
  • 数据库隔离级别

    2019-10-15 11:55:49
    一、隔离级别种类与分别可以解决的问题: 事务的隔离级别分为4个,即 读未提交(read uncommitted)、读已提交(read committed)、可重复读(Repeatable read)、可串行化(Serializable) oracle默认的隔离级别为 读已...

    一、隔离级别的种类与分别可以解决的问题:

      事务的隔离级别分为4个,即 读未提交(read uncommitted)、读已提交(read committed)、可重复读(Repeatable read)、可串行化(Serializable)

     oracle默认的隔离级别为 读已提交。mysql的默认隔离级别为 可重复读。

     简单来说:

      脏读即为session A读取到了session B中未提交的数据

      不可重复读即为session A读取到了session B提交的数据,即前后session A读取的数据不一致

      幻读即为session A读取到了session B insert的数据。

     

    二、隔离级别的设置与查询:

     1、设置隔离级别:

      设置隔离级别分为设置全局的隔离级别与设置当前的隔离级别

      全局设置,已存在的session不会生效,以后的新session会生效(以读未提交举例):

       set global transaction isolation level read uncommitted;

      单独设置当前连接:

        set session transaction isolation level read uncommitted;

     2 、查看当前隔离级别:

       select @tx_isolation;

     

    三、事务隔离级别的测试:

    有一个goods表,里面有id、count(商品数量)、brandId(品牌id)
     

    CREATE TABLE `goods` (
     
    `id` int(11) NOT NULL AUTO_INCREMENT,
     
    `count` int(11) DEFAULT '0',
     
    `brandId` int(11) DEFAULT '0',
     
    PRIMARY KEY (`id`),
     
    KEY `idx_brandId` (`brandId`)
     
    ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf-8;
    

    1、脏读(设置隔离级别为读未提交):

      脏读为读到其它事务未提交的数据:

    A B

    select * from goods where id = 1;

    返回1

     
      update goods set count = 2 where id = 1;

    select * from goods where id = 1;

    返回2

     
      commit;

      
     
       

     
       
    2、不可重复读(设置隔离级别为 读已提交)

      不可重复读为读到其它数据已提交的数据,即前后查询数据不一致

     

    A   B

    select * from goods where id = 1;

    返回1

     
     update goods set count = 2 where id = 1;

    select * from goods where id = 1;

    返回1

     
     

    commit

    select * from goods where id = 1;返回2 

     

     



    3、幻读(设置隔离级别为 可重复读):

      幻读为读到别人已提交的写入数据库的数据。

      幻读与不可重复读的区别为幻读为读到新插入的数据(insert),而不可重复读主要是更改与删除(update、delete)。

      即不可重复读前后被其它session update、delete的数据没有问题,不会有变化,但是其它session insert的可能有变化。

    AB

    select * from goods where brandId = 1;

    返回有id为1,2的两条

     
     insert into goods (count,brandId) values (3, 1);
       commit; 
     

    select * from goods where brandId = 1;

    返回有id为1,2,3的三条

        
     
         
      
    当隔离级别为 可串行化 的时候则不会出现上述问题。

     
     

    展开全文
  •   开篇声明,由于两位大佬排版不够美观,然后又发现一些歧义,因此我集百家之所长,精心整理并排版良好,可放心阅读。 ... 一、数据库事务正确执行的四个基本要素 1.1ACID...

      开篇声明,由于两位大佬排版不够美观,然后又发现一些歧义,因此我集大佬之所长,精心整理并加以完善,可放心阅读。
    http://blog.csdn.net/yuxin6866/article/details/52649048
    https://blog.csdn.net/zjxxyz123/article/details/79413729

    一、数据库事务正确执行的四个基本要素

    1.1ACID原则。

      ACID原则是数据库事务正常执行的四个基本要素,分别指原子性、一致性、独立性及持久性。

      原子性(Atomicity)是指一个事务要么全部执行,要么不执行,也就是说一个事务不可能只执行了一半就停止了,比如你从取款机取钱,这个事务可以分成两个步骤:1划卡,2出钱。不可能划了卡,而钱却没出来,这两步必须同时完成.要么就不完成。

      一致性(Consistency)是指事务的运行并不改变数据库中数据的一致性。例如,完整性约束了a+b=10,一个事务改变了a,那么b也应该随之改变。或者说,A给B转账300元钱,那么A的账户就必须是减少300元钱,B的账户就必须是增加300元钱,不能说是增加或减少了如200元钱等,这里符合事务的原子性,但是不符合事务的一致性。往实际业务中没有这么简单,往是类似买东西扣库存这类的逻辑,主表里有库存,库存表里有库存,SKU表里还有,然后就因为设计缺陷,就算加了事务还是出现了超卖、SKU库存对不上总库存的问题,这个就是一致性不满足的了。

      隔离性(独立性)(Isolation):事务的独立性也有称作隔离性,是指两个以上的事务不会出现交错执行的状态,因为这样可能会导致数据不一致。

      持久性(Durability):一旦事务提交或者回滚,这个状态都要持久化到数据库中,不考虑隔离性会出现的读问题。


    二、事务并发处理带来的问题

    2.1脏读、不可重复读,幻读,更新丢失。

      脏读(Dirty read):在一个事务中读取到另一个事务已经修改但没有提交的数据。例如,事务A对数据进行了修改,但是还没有提交,这时事务B读取这个数据,然后事务A回滚,那么事务B取的数据无效。不符合一致性

      不可重复读(NonRepeatable Read):既不能读到相同的数据内容,事务A读取到了事务B已经提交的修改数据(一个事务范围内两个相同的查询却返回了不同数据)。例如事务A先读取数据,然后事务B对该同一数据修改并提交,那么事务A再次读取该数据时,由于事务B对该数据的修改,事务A两次读到的的数据可能是不一样的。不符合隔离性

      幻读(Phantom Read):事务A读取到了事务B已经提交的新增数据。在一个事务中,两次查询的结果不一致(针对的insert操作) 。例如事务A对一个表中的数据进行了修改,同时,事务B也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,事务A的用户后面的操作发现表中还有没有修改的数据行,就好象发生了幻觉一样。不符合隔离性

      更新丢失(Update lose):两个事务同时操作相同数据,后提交的事务会覆盖先提交的事务处理结果。通过乐观锁就可以解决


    三、数据库事务隔离级别

      数据库事务的隔离级别有4个,由低到高依次为Read uncommitted(读未提交)、Read committed(读提交) 、Repeatable read(可重复读)、Serializable(序列化),这四个级别可以逐个解决脏读 、不可重复读 、幻读这几类问题。

    3.1 Read uncommitted(读未提交)

      公司发工资了,领导把5000元打到singo的账号上,但是该事务并未提交,而singo正好去查看账户,发现工资到账5000元整,非常高兴。可是不幸的是,领导发现发给singo的工资金应该是2000元,于是迅速回滚了事务(将5000元回滚),修改金额后(修改为2000元),将事务提交,最后singo实际的工资只有 2000元,singo空欢喜一场。

      出现上述情况,即我们所说的脏读 ,两个并发的事务,“事务A:领导给singo发工资”,“事务B:singo查询工资账户”,事务B读取了事务A尚未提交的数据。

      当隔离级别设置为Read uncommitted(读未提交)时,就可能出现脏读,如果我们此时将隔离级别提升为Read committed(读已提交),便可避免脏读。


    3.2 Read committed(读已提交)

      singo拿着工资卡去消费,系统读取到卡里确实有2000元,而此时她的老婆也正好在网上转账,把singo工资卡的2000元转到另一账户,并在 singo之前提交了事务,当singo扣款时,系统检查到singo的工资卡已经没有钱,扣款失败,singo十分纳闷,明明卡里有钱,到底是啥情况呢?

      出现上述情况,即我们所说的不可重复读 ,两个并发的事务,“事务A:singo消费”、“事务B:singo的老婆网上转账”,事务A事先读取了数据,事务B紧接了更新了数据,并提交了事务,而事务A再次读取该数据时,数据已经发生了改变。

      当隔离级别设置为Read committed(读已提交)时,避免了脏读,但是可能会造成不可重复读(既不能读到相同的数据内容)。

      大多数数据库的默认级别就是Read committed(读已提交),比如Sql Server , Oracle,此时如果将隔离级别提升为Repeatable read(可重复读),可以避免脏读和不可重复读的发生。


    3.3 Repeatable read(可重复读)

      当隔离级别设置为Repeatable read(可重复读)时,可以避免不可重复读。

      有A、B两个会话,分别开启两个事务,B查看余额是100元钱,然后A向B转了500元钱,A 提交事务,B再去查看,发现依旧是100元钱,B只能结束当前事务,在开启一个新事务,才能查询到数据的变化,这样便避免了不可重复读。如果我们设置了Seriizable(序列化),就相当于锁表,某一时间内只允许一个事务访问该表。

      虽然Repeatable read避免了不可重复读,但还有可能出现幻读 。

      比如singo的老婆工作在银行部门,她时常通过银行内部系统查看singo的信用卡消费记录。有一天,她正在查询到singo当月信用卡的总消费金额 (select sum(amount) from transaction where month = 本月)为80元,而singo此时正好在外面胡吃海塞后在收银台买单,消费1000元,即新增了一条1000元的消费记录(insert transaction … ),并提交了事务,随后singo的老婆将singo当月信用卡消费的明细打印到A4纸上,却发现消费总额为1080元,singo的老婆很诧异,以为出 现了幻觉,幻读就这样产生了。

      注:Mysql的默认隔离级别就是Repeatable read。


    3.4 Serializable(序列化)
      Serializable(序列化)是最高的事务隔离级别,同时代价也花费最高,性能很低,一般很少使用,在该级别下,事务顺序执行,不仅可以避免脏读、不可重复读,还避免了幻读。


    四、总结

    4.1 隔离级别与对应可能产生的问题表

    隔离级别脏读(Dirty read)不可重复读(NonRepeatable Read)幻读(Phantom Read)
    读未提交(Read uncommitted)可能可能可能
    读已提交(Read committed)不可能可能可能
    可重复读(Repeatable read)不可能不可能可能
    序列化(Serializable)不可能不可能不可能

    五、一些数据库锁的笔记等

    以下观点并非正确,大家可开启多个连接进行实践。

    5.1、锁定义和分类

    锁定义:
      锁是计算机协调多个进程和线程并发访问某一资源的机制。

    锁分类:
      (1) 按性能分类:乐观锁和悲观锁。
      (2) 按操作分类:读锁和写锁。
      (3) 按粒度分类:表锁和行锁。

    InnoDB与MyISAM的不同点:
      (1)前者支持事务(Transaction)。
      (2)采用了行级锁。

    5.2、一些总结笔记

      MyISAM在执行查询语句(SELECT)前会自动给涉及的所有表加读锁,在执行增删改操作前,会自动给涉及的所有表加写锁。

    读锁:一个会话给表加了读锁,没有释放,那么当前会话及其他会话就无法写,只能读。
    写锁:一个会话给表加了写锁,没有释放,那么当前会话可以对表读和写,其他会话不能读也不能写。

    InnoDB行锁:
    只对当前行加锁,一个会话开启事务,然后进行更新,另一个会话也要对这行数据进行更新,那么会等前面的会话提交才能更新。

    当隔离级别可重复读时:
      第一次查询会有快照,比如事务A更新了数据,但是事务B还没有执行查询操作,然后B查询,那么B查询的数据是事务A更新后的,以后每次查询,都是查询这次的快照。比如金额原先为100元,事务A将之更新为200,事务B查询的时候,是200,如果事务B先查询,事务A后更新,那么事务B查询到的还是100。但即使查询的数据是100(事务B已经更新成了200),如果事务A对金额进行加200的操作,那么结果是400,不是300,所以说,可重复读取不将查询结果(100)拿来当作变量运算的话,其执行结果是正确的。

    幻读,也是在其他事务修改数据后,才进行读取,才能读到其他事务已提交的数据。

    展开全文
  • 数据库事务隔离级别

    2017-08-09 16:14:50
    分类: 目录(?)[+ ...数据库事务的隔离级别有4个,由低到高依次为Read uncommitted(未授权读取、读未提交)、Read committed(授权读取、读提交)、Repeatable read(可重复读取)、Serializable
  • 数据库锁 为什么引入数据库锁 多个用户同时对数据库的并发操作时会带来以下数据不一致的问题: 丢失更新 A,B两个用户读同一数据并进行修改,其中一个用户的修改结果破坏了另一个修改的结果,比如订票系统 脏读 A用户...
  • 本文解释数据库并发控制事务 对数据库数据执行的一系列操作,可以是一... 多个事务对数据库的操作要相互隔离 4、 持久性 事务提交后的数据在数据库中是永久存在的 数据库并发操作产生的异常现象:1、 脏读 读取一个
  • 文章目录数据库事务一致...I锁)区间锁/间隙锁(gap locks)next-Key locks作用范围分类行锁表锁乐观锁版本号(version)时间戳(timestamp)待更新字段所有字段乐观锁几种方式比较数据库隔离级别READ_UNCOMMITTED(RU)锁分析RE
  • 本文将从以下4个方面来展开: (1)事务的4大特性:...(2)数据库并发操作产生的问题: 丢失更新 脏读 不可重复读 幻读 第一类更新和第二类更新(用于事务A回退 或则提交导致事务的B的操作被覆盖掉) ...
  • 了解了数据的锁机制,数据库隔离级别也就好理解多了。每一种隔离级别满足不同的数据要求,使用不同程度的锁。 Read Uncommitted,读写均不使用锁,数据的一致性最差,也会出现许多逻辑错误;会导致脏读、丢失...
  • 数据库隔离级别

    2014-10-14 08:48:00
    关于数据库事务隔离级别的介绍 事务(Transaction)是并发控制的基本单位。所谓的事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。例如,银行转账工作:从一个账号扣款并...
  • 数据库为了维护事务的几种性质,尤其是一致性和隔离性,一般使用加锁这种方式。同时数据库又是个高并发的应用,同一时间会有大量的并发访问,如果加锁过度,会极大的降低并发处理能力。所以对于加锁的处理,可以说...
  • 数据库MVCC 隔离级别

    2019-04-26 15:37:25
    多版本并发控制(Multi-Version Concurrency Control, MVCC),顾名思义,在并发访问的时候,数据存在版本的概念,可以有效地提升数据库并发能力,常见的数据库如MySQL、MS SQL Server、IBM DB2、Hbase、MongoDB等等...
  • 数据库事务中的隔离级别和锁  数据库事务在后端开发中占非常重要的地位,如何确保数据读取的正确性、安全性也是我们需要研究的问题。 ACID  首先总结一下数据库事务正确执行的四个要素(ACID): 原子性...
  • java操作数据库的思想:连上数据库,发送sql语句。在连上数据库之前,要先用程序启动数据库,因此,可以通过反射加载类驱动(com.jdbc.mysql.Driver)。通过驱动管理类的静态方法传递数据库的url来获取一个连接对象...
  • 浅谈对数据库隔离级别的理解当人们提及数据库管理系统(DBMS),必会提及事务、ACID特性以及事务隔离级别。事务本身是为了保证系统的运行状态最终将处于一致性(满足一组约束条件)的状态而出现的概念,其中的ACID特性中...
  • 在程序中对数据库数据进行变动的时候,如果该段程序是并发的就很容易出现数据修改紊乱的问题,多任务同时进行修改同一个数据,这时候需要一个解决方法。 悲观锁 乐观锁 任务队列 悲观锁: - 当我们...
  • 登陆数据库 mysql -uroot -p 2、增删改查 对应操作 命令 备注 增 insert into 表名(字段1,字段2,…) values(值1,值2,…); 删 delete from 表名 where…; 改 update 表名 set 修改的值 where ...
  • 数据库事务隔离级别分类 数据库事务级别分为不可重复读、幻想读和脏读。 不可重复读 不可重复读的意思是事务T1读取了一条数据,然后T2修改了这条数据,然后T2提交事务,T1再次查询,查询到的数据与之前不同。即一个...
  • 3、隔离性(isolation):可能有许多事务会同时处理相同的数据,因此每个事务都应该与其他事务隔离开来,防止数据损坏。 4、持久性(durability):一旦事务完成,无论发生什么系统错误,它的结果都不应该受到影响。通常...
  • 文章目录什么是事务事务的四大特性(ACID)并发事务带来的问题事务隔离级别 什么是事务 事务是逻辑上的一组操作,要么都执行,要么都不执行。 事务最经典也经常被拿出来说例子就是转账了。假如小明要给小红转账1000元...
  • Innodb中的事务隔离级别和锁的关系 事务中的加锁方式 * MySQL中锁的种类 Read Committed(读取提交内容) Repeatable Read(可重读) * 不可重复读和幻读的区别 悲观锁和乐观锁 MVCC在MySQL的InnoDB中的实现 ...
  • 数据库四种隔离级别,以及常见的几种 读异常 ,大家应该都是耳熟能详的,但数据库底层是怎么实现隔离性的呢?都采用了哪些技术呢? 主要有两个技术:MVCC(多版本并发控制)和锁。 (1)MVCC(多版本并发控制) 多...
  • 我们都知道事务的几种性质,数据库为了维护这些性质,尤其是一致性和隔离性,一般使用加锁这种方式。同时数据库又是个高并发的应用,同一时间会有大量的并发访问,如果加锁过度,会极大的降低并发处理能力。所以对于...
  • 数据库隔离级别及相关...

    千次阅读 多人点赞 2018-12-18 09:51:28
    数据库隔离级别要明白隔离级别,得先明白数据库中的事务(Database Transaction)四个特性:1. 原子性(atomic)(atomicity)2. 一致性(consistent)(consistency)3. 隔离性(insulation)(isolation)4. 持久性...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 35,660
精华内容 14,264
关键字:

数据库的隔离级别种类