数据库系列3-隔离性

现在常规的应用系统中,每一个接口基本都需要执行多条更新SQL。这就要求多条SQL的更新要么全部生效,要么全部都不生效。这就是所谓的原子性,事务的四大特性之一。MySQL原生的存储引MyISAM是不支持事务的,因此大部分场景都需要用InnoDB存储引擎,其也是新版MySQL的默认存储引擎。

事务之ACID特性

Atomicity-原子性

Consistency-一致性

Isolation-隔离性

Durability-持久性

隔离级别是为了解决多个事务同时执行过程中,会出现的脏读,不可重复读和幻读问题

脏读-Dirty Read

读到了其他事务未提交的更新,当那个事务回滚后,这条更新就是脏数据了。

不可重复读-Nonrepeatable Read

针对同一条数据,第一次读的时候还未提交,第二次再读的时候,已经提交了,所以读到了。

幻读-Phantom Read

针对范围查询,第二次再读的时候,其他事务提交了一条更新,在这个范围内。对当前事务来说,

第二次读的时候,比第一次读的时候多了一条数据。

针对上面每种问题,数据库规范?定义了四种隔离级别

READ_UNCOMMITED

当前事务可以看到其他事务未提交的更新

READ_COMMITED

当前事务只能读到其他事务已提交的更新

REPEATABLE_READ

当前事务中任何时刻读取的数据都一致,即使其他事务的更新已经提交了

SERIALIABLE

事务串行

各种隔离级别的实现方案,事务访问的数据都是以视图的逻辑结果为准。在REPEATABLE_READ隔离 级别下,这个视图是在事务启动时创建的,整个事务存在期间都用这个视图。在READ_COMMITED隔离级 别下,这个视图是在每个SQL语句开始执行的时候创建的。这里需要注意的是,READ_UNCOMMITED隔离级别下直接返回记录上的最新值,没有视图概念;而SERIALIABLE隔离级别下直接用加锁的方式来避 免并行访问。

综上,为解决多事务并发问题,针对不同问题采用不同的解决方案

1.MVVC-Multi Version Currency Control,利用undo log实现的视图逻辑结果,具体实现方案见[https://www.jianshu.com/p/f692d4f8a53e

2.加锁,使事务串行执行

问题:在具体实现中,两种方案是怎么配合使用的?

试验,在实际试验不同事务隔离级的效果时,可以直接写SQL试验。

开启事务的方式有以下两种

begin;(或者 start transaction;)

sql statement;

commit; (回滚 rollback;)

set autocommit=0

开启了事务,怎么指定事务隔离级别。在MySQL中,事务隔离级别有

全局级

SELECT @@global.tx_isolation;

会话级

SELECT @@session.tx_isolation;

所有的???

SELECT @@tx_isolation;

设置事务隔离的命令(不区分大小写)

SET [SESSION | GLOBAL] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE}

例如给当前连接上的事务设置隔离为读未提交

set session transaction isolation level read uncommited

如果不指定session 或者global,则设置对下一个事务生效。(不是太懂)

试验一把,在一个连接中更新,但是不提交,在另一个连接中,设置事务隔离级别为read uncommited 然后查询,看是否能看到更新。果然能看到。

有个问题,每一条SQL都是在事务下执行的。就算对于一个select语句来讲,也是在事务中的,因为当前的事务隔离级别决定了他能看到什么样的数据。

所谓只读事务是什么概念??

官方文档更能直至本质https://dev.mysql.com/doc/refman/5.7/en/innodb-autocommit-commit-rollback.html

一直讲事务隔离级别,但是忽略了一个重要的概念,那就是autocommit

根据上面的官方文档,所有的用户行为(我的理解是执行的任何DML语句)都是在事务里的(跟我上面的理解是一致的,哈哈哈)。如果开启了autocommit,每一个单独的SQL都会产生一个属于它自己的事务,所以SQL执行成功后(当错误后的处理策略再研究),MySQL就会自动执行commit操作。默认情况下,autocommit是开启的。所以我们执行完update insert等语句后,数据会及时持久化到磁盘。问题来了,如果关闭autocommit会有什么影响,这个配置是session级还是全局级的?

第二个问题,通过试验(set autocommit =0;)得出结论,关闭autocommit只在当前session中生效,其他session不受影响。

第一个问题,还是根据官方文档,如果关闭autocommit,一个session默认会开启事务,直到用户执行了commit或者rollback后,才会结束这个事务,并且再开启一个新事务。

综上,要想将多个SQL明确放在一个事务中,便于统一提交或者回滚,有两种方式

方式一、关闭autocommit,所有SQL执行完之后,再commit或者rollback。

方式二、在执行第一条SQL前,执行begin或者start transaction,所有SQL执行完之后,再commit或者rollback。

所以任何一条DML语句都是在事务中执行的,区别在于事务的范围(即包含了哪些SQL)以及事务的提交或者回滚执行的时刻。讲到这里,发现事务跟线程的概念相似,任何一段代码都是在某个线程中执行的,要么自己指定用哪个线程,要么就是系统提供的主线程。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,185评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,652评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,524评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,339评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,387评论 6 391
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,287评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,130评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,985评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,420评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,617评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,779评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,477评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,088评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,716评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,857评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,876评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,700评论 2 354

推荐阅读更多精彩内容