我是真的不想在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