Mysql事务

事务的来源

  • 现代编程都提供多线程的支持,那么多个线程同时对同一个表的进行操作的时候,为了保证数据的一致性,因此需要事务。
    经典银行转账例子:
    A给B转账100元,先从A账号中扣除100元,再给B账号添加100元。如果不使用事务的情况下如果A扣除100元后,给B添加100元的时候出现错误导致没有给B添加100元。而A则被扣除了100元的情况。

  • 在Mysql的引擎中InoDB支持事务的,而MyISAM\CSV\MEMORY等数据引擎是不支持事务。我们可以通过mysql的show engines进行查看。


    image.png
  • 怎样知道我们系统使用的是哪一个存储引擎呢?通过 show variables like '%storage_engine%'查看系统默认的存储引擎,在Mysql 5.6以后默认使用的是InnoDB也就是说我们当前是支持事务的。

    image.png

事务的特性

事务的特性主要是ACID,Atomicity(原子性)、Consistency(一致性)、Isolation(隔离性)、Durability(持久性).

  • 原子性:是一个事务不可以分割的最小单位。要么事务的执行全部成功,要么全部失败。不存在中间状态。

  • 一致性性:事务的执行是数据库的状态从一种一致性的状态变成另外一种一致性的状态。
    在事务的开始到事务的结束数据库中的数据的完整性没有被破坏。例如上面转账的经典案例。整个转账的过程100元是从A转到B账户中,就是所谓数据的状态从一种一致性状态转变成另外一种一致性状态。

  • 隔离性:各个事务的执行互不干扰。也就是说A事务的执行不会被B事务的造成影响。

  • 持久性:事务的执行一旦被提交。事务执行的结果会被数据库永久保存。也就是说我们执行Commit后,事务执行结果数据就会被数据永久保存。 即使数据库崩溃也不对已提交的数据造成影响。

事务隔离的级别

事务级别

由于事务的隔离性,保证事务之间互不干扰,那么多个用户对数据进行操作的时候就出现不一致的情况,而针对这种不一致的情况就是我们事务隔离级别所要处理的事情。而事务的隔离级别有脏读(Read UnCommited)、不可重复读(Read Commited)、可重复读(Repetable-read)、可串联化(Serializable)。

  • 脏读:脏读一种读取未提交的数据,如:事务A读取了事务B的更新数据,然后事务B进行回滚,那么A就是读取了B的脏数据。


    image.png

    image.png

    image.png

    image.png
  • 不可重复读:不可重复读是一种读取了已提交的数据,如事务A多次读取同一个数据,而事务B在事务A读取的过程中进行更新数据,那么事务A第一次读取的数据是没有被事务B更新的数据,而在N次读取同一数据时,事务B已经提交,则事务A读取的是事务B提交后的数据。而不可重复读侧重于数据的修改.针对不可重读的问题通过行锁就可以进行解决。


    image.png

    image.png

    image.png

    image.png
  • 可重复读: 原始数据为0,事务A对数据进行了更新为1100的操作没有进行提交,而事务B能读取的原始数据是0,这个时候事务A进行了提交。而事务B再一次查询的时候原始数据还是0。因为事务B使用的是原始数据的快照,而不是从数据库中查找最新的数据。


    image.png

    image.png

    image.png

    image.png

    image.png

    image.png
  • 幻读:一事务对数据进行了新增操作,另一事务两次查询的数据不一致.幻读侧重于对数据的增删。针对幻读通过表锁进行解决。


    image.png

    image.png

    image.png

    image.png

    image.png

    image.png

    image.png
  • 可串联化:可串联化是最高的隔离级别,对即在读取的每一行数据上会加锁,事物顺序执行。所以会出现锁超时等问题。

事务隔离最高级别

  • 从事务的并发性角度分析隔离级别则:
    1-串联化
    2-可重复读
    3-不可重复去
    4-脏读
  • 从性能的角度分析隔离级别:
    1-脏读
    2-不可重复去
    3-可重复读
    4-串联化
    隔离级别越高越保证数据的完整性和一致性。但是对并发的影响越大。而对于大多数应用来说,优先考虑使用Read Commit,能处理脏读的问题,并且有较好并发性能。

Mysql默认的事务隔离级别

  • Mysql默认的事务隔离级别是:可重复读.show variables like '%tx_isolation%'
    image.png

Mysql表锁与隔离级别

  • 事务的隔离级别为可重复读的时候,如果有索引的时候,以索引列为条件更新数据,会存在间隙锁、行锁、页锁的问题,从而锁住这一行数据。如果没有索引,则更新数据会锁整张表。


    image.png
image.png
  • 事务级别为串行化的时候,表的读写都会锁表。

你可能感兴趣的:(Mysql事务)