zoukankan      html  css  js  c++  java
  • mysql事务

    1.事务:是指一组不可分割的逻辑单位,由ACID四大属性来描述

    (1)原子性:是指一组sql要么全做完commit,要不就rowBack。

    (2)一致性:是指事务要从一个一致性状态变为另一个一致性行状态,这里的一致性是指数据完整性和业务逻辑的一致性。

    (3)持久性:是指一旦事务提交后对数据库的改变是永久性的,即使系统崩溃依然能够通过日志进行恢复。

    (4)隔离性:在并发操作数据库时,其它事务不能读取到当前事务操作过程中的数据。假设A事务正在进行写操作,那么B事务只能读取到A事务修改之前的数据或者是A事务提交之后的数据。

    2.由于事务的隔离性的不同可能出现以下几种问题:

    (1).脏读:A事务读取到了B事务正在修改的数据(注意此时B事务还没有进行提交或者回滚)

    (2).不可重复读:主要是针对delete与update这两个操作,A事务按照某个条件进行查询,此时B事务修改(delete或update)了某条数据并提交,此时A事务在去按照原来的条件去查询发现数据改变了。

    (3).幻读:主要是针对insert操作,A事务按照某个条件进行查询,此时B事务插入了某条数据并提交,此时A事务在去按照原来的条件去查询发现多了行数据(这些多出来的行为幻影行)

    3.为了解决这些问题,数据库定义了几大隔离级别:

    (1)读未提交:可能出现脏读,不可重复度以及幻读,这个状态隔离性最差。

    (2)读已提交:解决了脏读,依然有不可重复度以及幻读。

    (3)可重复度:在上一个基础上海解决了不可重复度的问题,依然存在幻读。

    (4)串行化:解决了所有的问题。

    4.在mysql中是通过乐观锁(MVCC)以及悲观锁来实现事务的隔离级别的。

    5.在mysql的Innodb引擎中默认可重复读级别的,在此级别通过间隙锁(GAP锁)来解决幻影行的插入。

    6.可能有人会认为不可重复度与幻读好像差不多,我说一下我的理解

      (1).首先我认为不可重复度与幻读的区分在于解决方法的不同。

      (2).对于update或者delete来说我们只需要将符合条件的记录加锁就可以解决了,但是此时依然无法避免其它符合条件的记录插入进来。这个就是可重复度转态。

      (3).对于insert操作来讲,我们还需要将符合条件的行的间隙之间加锁,才能解决幻影行的插入。

  • 相关阅读:
    ThinkPHP运算符 与 SQL运算符 对比表
    [Java 8] (6) Lambda与资源管理
    Codeforces Round #275 (Div. 2) C
    HOJ 2245 浮游三角胞(数学啊 )
    [UVALive 6663 Count the Regions] (dfs + 离散化)
    浅解ARC中的 __bridge、__bridge_retained和__bridge_transfer
    SpringMVC: web.xml中声明DispatcherServlet时一定要加入load-on-startup标签
    Unity3d 4.3.4f1执行项目
    更新Windows ActiveX,Ios
    C++11: final与override
  • 原文地址:https://www.cnblogs.com/liwangcai/p/10745941.html
Copyright © 2011-2022 走看看