【数据库】—— Mysql事务的简单剖析

前言

  我是真的不想在csdn上面写博客了,但看看其他的网站,唉,我还是回来吧。

  涉及到的知识点

  事务并发产生的问题,事务的隔离级别

 

正文

  事务

  一般第一个讨论的问题应该都是what,什么是事务,那我也给大家粘贴一下一个百科释义

   指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。

 

  然后事务的四大特性也是老生常谈了,ACID,这我也不说了

   然后这几个特性又是如何实现的,不知道有没有童鞋想过,涉及到两个文件,redo 和 undo 。

   具体的就不说了,留到后面咱们讨论mvcc的时候,在详细说明。

 

  开启方式

   自动开启

   在咱们做增删改的时候,事务就自动开启提交了,不然你可以用show VARIABLES like 'autocommit' 看一下,是不是自动提交。

   它又分为两个级别,global和session,一般情况下咱么都不和global玩

           我们可以用set session autocommit = off/on 来设置是不是自动提交,

   手动开启

   开启:begin / start transaction

   提交/回滚:commit / rollback

 

  事务并发产生的三大问题

   脏读

   指,一个事务中,先后两次读取同一条数据,而在此期间有另一个事务对其进行修改,但没有提交,而是进行了回滚,那此时第一个事务就懵逼了。

   

   

   可重复读

   指,一个事务中,先后两次读取同一条数据,而在此期间有另一个事务对其进行了修改,并提交了数据,那此时第一个事务就懵逼了。 

   

   

   幻读

   指,一个事务中,先后两次读取某个范围内的数据,而在此期间有另一个事务对其进行了插入操作,那此时第一个事务再一次的懵逼了。

   

   

   对比

   脏读VS可重复读:都是一个事务读取同一条数据,先后不一致的问题,脏读为第二个事务回滚了事务,可重复读为第二个事务提交了事务

   可重复度VS幻读:都是事务提交事务之后产生的问题,可重复读为update / delete,幻读为insert

 

  隔离级别

   四个隔离级别

   Read Uncommitted(读未提交)——  不能解决任何问题

   Read Committed(读已提交)——  解决脏读问题

   Repeatable Read(可重复读)——  解决脏读和重复读问题,innodb中已解决幻读问题

   Serializable(串行化)——  可以解决所有问题

      

   隔离级别的实现方式

   第一种:在读取数据前,对其进行加锁,组织其他事务对数据进行修改(LBCC)Lockbased Concurrent Control

   第二种:生成一个数据请求时间点的一致性数据快照(Snapshot),并用这个快照来提供一定级别(语句级或事务级)的一致性读取(MVCC)Multiversion Concurrency Control

 

   然后基本上今天的所有内容已经结束了,在最后简单的总结一下。

   事务挺好的,但是在事务并发执行时会有些问题,于是针对这些问题产生了对应的隔离界别,然后隔离级别的实现方式又有两个,是接下来的两篇文章将要涉及到的内容。   

结语

  Hello Wrold

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章