事务的学习笔记(一)

有一天,快睡觉了,为了巩固下数据库知识,我跟我女朋友讲了事务的概念。
她问我事务是什么?是不是所有的sql都需要事务?

事务是什么

大家都知道,比如说我们要做一件事情,一般是有多个步骤才能完成,当然单个操作的也有。
那么我的理解就是,你要做的这一件事情就是一个事务,它是由一串操作来完成的。多个操作的前后顺序就要做调度。

事务的几大特性

那么我们在做一件事情的时候,是否有时候会做到一半放弃呀,这个时候为了保证不影响别的事情,咱们要清除刚刚未完成事情所造成的影响。这就叫做回滚。
比如咱们做的事情是发邮件,在写到一半的时候,老板说取消发送这个方案,那咱们是要把刚刚写的邮件删除的。
那假如咱们把邮件发出去了,那么发邮件的事情就是做完了,也就叫做事务已经提交。
如果这时候老板叫我们取消这个方案,其实发出去的邮件如果别人看到了,其实咱们是很难消除这个影响的,也就是说,事务已经提交,不能够再撤回,这个时候咱们只能执行补偿事务,即咱们只能打电话告诉人家这个方案是不行的。

原子性

上面说的这个取消发邮件的例子,就是事务的原子性。一般来说,原子性的意思就是一个操作不可再分,就像化学里面的原子一样,是最小单位。当然原则上事务的原子性指的也是一个事务执行的时候不能被打断,要看作一个整体。那么实际上指的是事务的最终表现要么是成功的,要么是没有出现过的。因为现实中,咱们要求数据库执行的性能啥的,需要并发执行事务。

隔离性

现在咱们知道事务是会并发执行的,现在咱们来考虑一个场景:比如我要给我女朋友打钱,这个时候刚好要还贷款。假如打完钱就不够还贷款了。如果两个事务一起执行的话,很可能会出现贷款公司刚刚读出我的余额,发现够还钱,下一刹那,我就把钱打给我女朋友了,这时候可能会出现贷款也还了,钱还转了。哈哈,所以这时候就要求事务是隔离的。即Ti和Tj两个事务并发执行,但是Tj不能影响到Ti的执行,也就是说,Ti在自己执行的时候,感觉到Tj是已经执行完了,或者还没开始执行。他只看到自己在执行。

一致性

假如咱们发现,本来打算给女朋友汇2000的,结果自己账号就扣了1000,女朋友还真收到2000了,这就是事务的不一致性。不一致性是需要程序员自己去保证的。也即使说,隔离执行事务时,保证事务的一致性。按照我的理解就是,在不受其他事务的影响的情况下,你的需求是否正确执行。

持久性

假如过了几天,我女朋友告诉问我怎么还没打钱呀,小孩都喝不上奶了,那么我一查,账户上的钱确实没有打过去,但是明明记得已经打了呀,应该不是幻觉,这是数据库估计出了啥事情把我们的事务给忘记了。
就算数据库奔溃了,一旦恢复还是要记得咱们执行过的事务,这就是持久性。

事务的原子性和持久性

上面已经介绍了事务的四大特性。这里我们讲下数据库时如何保证事务的这些特性的。
数据库在执行事务之前,会把事务需要执行的操作记录到日志中,当我们回滚的时候,就可以按照日志里的记录反向执行。或者在发生故障后,可以根据日志恢复数据。
数据库是存在恢复系统的。具体的恢复策略可以在写那章的时候讲。

隔离性级别

首先讲几个概念

  • 可串行化调度
    之前咱们已经说过调度,串行话调度其实就是交换两个事务之间的调度顺序,使其达到串行执行的目的。
  • 可恢复调度
    前面我们已经说过,事务提交后时很难恢复的。A事务在操作B事务更行的数据后,立马提交,然后B事务出了故障开始回滚,那么A事务依赖B事务的修改其实是不存在的。
    所以一个可恢复的调度应该是,A事务做了修改,B事务依赖这个修改,那么必须在A事务提交后B事务才能提交。
  • 无级联调度
    假设B调用了A正在修改的数据,然后C调用了B正在修改的数据,那么当A出错回滚的时候,B和C也都要回滚,所以我们需要等A提交了再调用A的数据。这样就不会有级联调用了。
隔离性分为4个级别:
  • 可串行化
    可串行化调度
  • 可重复读
    在一个事务中,任何两次读取同一个数据源时,数据是一样的。
  • 已提交读
    在读取别的事务操作的数据之前,那个事务必须时已经提交的。
  • 未提交读
    在读取别的事务操作的数据之前,那个事务没有提交也可以。

下面我们看下,为什么会出现上述这4个级别。
可串行化调度基本上是没有并发的,类似与一个cpu利用不同时间片执行不同任务一样。
可重复读是mysql默认的隔离级别,意思是再同一个事务中,不论何时两次读取同一个数据应该都是一样的。为什么会有这样的需求,我们看下面的。
已提交读,其实也是不可重复读。即要读某个数据之前,操作它的那个事务必须是已经提交了,这样可以避免脏读,但是是不可重复读,因为当我读完之后,别的事务就可以改变我的数据,那么下次读数据就是不一样了。下面我们来举一个例子:
假如你正在看作业题目,第一次看的时候是要求A+B的值,等你在想的时候,题目变成A-B的值,这时你是不是会觉得见鬼了呢?
所以不可重复读是会造成事务不一致的。
未提交读很明显,会发生脏读,比如事务随时可能会回滚,咱们很可能读了不存在的数据。

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

推荐阅读更多精彩内容