mysql的事务

1 事务的4个特性 (必回,面试必考)

      ① 原子性:原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。

      ② 一致性: 事务前后数据的完整性必须保持一致

      ③ 隔离性: 事务的隔离性是指多个用户并发访问数据库时,一个用户的事务不能被其它用户的事务所干扰,多个并发事务之间数据要相互隔离。

      ④ 持久性:持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响

      下面说一下事务的隔离性:数据库设置了4种隔离级别

        1 Serializable:可避免脏读、不可重复读、虚读情况的发生。(串行化)
        2 Repeatable read:可避免脏读、不可重复读情况的发生。(可重复读)不可以避免虚读
        3 Read committed:可避免脏读情况发生(读已提交)
        4 Read uncommitted:最低级别,以上情况均无法保证。(读未提交)

        根据数据库的隔离级别,会发生不同的存储情况。

       

       脏读:一个事务读取了另一个事务未提交的事务,就是事务A 在没有commit的时候,事务B读取了事务A未提交的数据。

扫描二维码关注公众号,回复: 402619 查看本文章

      不可重复读:在一个事务先后两次读取发生数据不一致情况,第二次读取到另一个事务已经提交数据 (强调数据更新 update)
      A 查询账户 5000
      B 向 A 账户转入 5000
      A 查询账户 10000
      虚读(幻读) : 在一个事务中,第二次读取发生数据记录数的不同 ,读取到另一个事务已经提交数据       (强调数据记录变化 insert )
      A 第一次读取 存在5条记录
      B 向 A 插入一条新的记录
      A 第二次读取 存在6条记录

      

      在实际的项目中,我们需要根据需求设置相应的事务的隔离界别。

      例如我在做报表的时候,我就需要设置事务不能脏读,不可重复读,有人可能会问,不可重复读有什么问题,数据更新不应该有问题,下面说一下我自己的理解,还是那上面的报表,例如我开始输出我的数据,但是这个时候,另一个客户端更新了我的数据,那么我的客户端就更新当前的数据,那么久没有办法做出我的报表,所以我需要根据需求,设置相应的数据库的隔离级别。

  

   摘自别的博客,做一些补充。

--不可重复读的重点是修改:
同样的条件, 你读取过的数据, 再次读取出来发现值不一样了
--幻读的重点在于新增或者删除
同样的条件, 第1次和第2次读出来的记录数不一样
当然, 从总的结果来看, 似乎两者都表现为两次读取的结果不一致.
但如果你从控制的角度来看, 两者的区别就比较大
对于前者, 只需要锁住满足条件的记录
对于后者, 要锁住满足条件及其相近的记录

猜你喜欢

转载自1193355343.iteye.com/blog/2372976