最近对有些同学问了我下事务的一些相关知识,在高并发下,事务有什么性能影响? 会不会有堵塞的问题? mysql是如何处理这些的。。。。。突然印象中记得很久之前研究过,可是尼玛,忘了。为了重新捡起知识。于是再次进去了深入分析和学习。平时工作忙比较少写博客,今天开始多学会总结和分享啦。
开始时候,我们首先得了解事务的ACID四个特征(简单,不需再说),隔离的四个级别,innodb的mvcc(多版本并发控制),redo/undo 等等。
先说事务隔离级别:
1.Read Uncommitted(未提交读) ---------> read-uncommitted
2.Read Committed (提交读) --------> read-committed
3.Repeatable Read (可重读) mysql 默认级别 ---------> repeatable-read
4.Serializable (串行化)注:事务级别最高,串行执行 ---------> serializable
说事务隔离区别前,先简单说一下怎么设置系统事务隔离级别和会话事务隔离级别
查看InnoDB存储引擎 系统级的隔离级别 和 会话级的隔离级别
下面以单词首字母作为简称分析:
1、RU 未提交读
容易造成脏数据:
A 和 B 两个实例作为例子
A:
B:
认真看看,尼玛,AB开了未提交隔离模式,B就直接读取A中没有添加的插入那行了。造成了严重的脏数据。提交读,可以帮你解决这个问题。
2、RC (提交读)
A:
B:
A插入新行,可是在事务B里查询两次,两次结果不一样,明显出现了不可重复读的情况。前后两次不一致。重复读可以给你解决这个问题。
3、RR (可重复读)
A:
B:
呵呵,A新增了一行,并且commit,可是在B的事务里,前后两次数据并没有变化。(mysql默认事务隔离级别)
但是这会有出现一种幻读现象,比如,A事务插了一条,B事务由于查询前后不变,当B去插同一条时候,会报错。
这个是mysql最常用类型。
4、Serializable (串行模式)
A 事务并没有添加的时候,B根本不能往里面插数据。。。。。。
这种类型,无论是从效率来说还是从实质来说,应用场景不多。
(试着类型时候,记得把autocommit 关了,不然没有效果) set autocommit=off;
呵呵,从以上四种事务级别来说不同有不同应用。
----------小龙说法,有不同观点有不同见解可以留下意见哈。