mysql 的事务细节

mysql 如何实现事务的隔离级别:

mvcc :
MVCC的全称是“多版本并发控制”。这项技术使得InnoDB的事务隔离级别下执行一致性读操作有了保证,换言之,
就是为了查询一些正在被另一个事务更新的行,并且可以看到它们被更新之前的值。这是一个可以用来增强并发性
的强大的技术,因为这样的一来的话查询就不用等待另一个事务释放锁。这项技术在数据库领域并不是普遍使用的。
一些其它的数据库产品,以及mysql其它的存储引擎并不支持它。
在没有mvcc机制的时候:如果a事务给数据加上了锁,其他所有读写请求只能排队。mvcc通过在不同的时间节点
构建不同的视图来支持多事务读操作。在通过innodb的undolog来实现的


undo log:
在数据修改的时候,不仅记录了redo,还记录了相对应的undo,如果因为某些原因导致事务失败或回滚了,可以借助该undo进行回滚。
undo log和redo log记录物理日志不一样,它是逻辑日志。可以认为当delete一条记录时,undo log中会记录一条
对应的insert记录,反之亦然,当update一条记录时,它记录一条对应相反的update记录。
undo log是采用段(segment)的方式来记录的,每个undo操作在记录的时候占用一个undo log segment。
另外,undo log也会产生redo log,因为undo log也要实现持久性保护。

行锁

1.两阶段锁:行锁是在更新操作下才会加,但是需要持续到事务结束
2.应该尽量减少锁的粒度,减少对锁的持有时间
3.应该提防事务大规模数据更新,容易形成死锁
4.大规模事务更新的时候应该将粒度拆分

可重复读

可重复读:在事务开启时候,读取所有的数据在整个事务期间是相同的,
视图是在事务提交后才失效

基于上面两个标题提出一个疑问
在rr 模式下,一致性读是否还有效果。如果同时两个事务修改一条数据一致性读很明显会让数据错乱?

解答:

首先,需要确认一点,上面问题具有迷惑性。一致性视图是用于读的,这里存在好几个概念:
1.可重复读
2.行锁
3,当前读

事务的可见性:

前面讲过:在事务开启的时候,读取所有数据再事务期间都是相同的,除非事务本身修改的内容,这就是
事务的可重复读。这是数据可见性的前提。

版本:
那么回归到我们的版本:innodb 的每条数据可以共存多个版本,是由row trx_id 这个确定的,这个对我们
来说是不可见的。一个trxid 对应的就是一个版本。 当多事务共同操作相同的数据的时候,可出现多个trxid,
每个trxid 之间存在一些联系 ,这就是undolog。假设一个账户数据 在多个事务运行同时存在:v1、v2、v3,
那么最新的版本数据就是v3,但是存在某个视图读取的肯定是v1,那么在一致性视图层面来讲 v1 =v3回滚+v2
回滚计算出来的,因为数据库不可能同时存在v1,v2,v3 三个版本的数据。v1,v2只能是临时及算出来的。

水位:
当一个事务启动的时候,会同时记录当前正在进行的所有事务,组成一个数组[ t1,t2,t3],
按照事务id顺序排列。数组里面事务 ID 的最小值记为低水位,当前系统里面已经创建过
的事务 ID 的最大值加 1 记为高水位。程序更多的是通过高低水位来判断某行应该取那
个时间段的数据。因为水位是不会变的,所以事务整体的视图是不会变的。

总结:
事务可见不可见可以通过:
版本未提交,不可见;
版本已提交,但是是在视图创建后提交的,不可见;
版本已提交,而且是在视图创建前提交的,可见。

总归回来好似讲了一番废话,但是却表述了一致性视图的原理

事务中的update:

案例:
某用户,同时收到3笔转账,第一笔+100,第二
笔+200,第三笔+300,如果按照数据修改是基于一致性视图来的,那么用户的钱只能
是最后一笔提交的。

反证法:
其实这里又要结合行锁来讲解了。反证法:假设事务中的修改基于一致性视图,如果多
个事务修改某一行数据,假设行数据读取的是一致性视图,那么数据将总是以最后修改
的数据为准。但是事实却不是这样的。

当前读:
事实上通过这个例子,我们就可以知道update 不是通过一致性视图来操作的。
“更新数据都是先读后写的,而这个读,只能读当前的值,称为“当前读”(current read)”。
其实select 也可以使用这个: 加锁: share mode 或者 for update 两种锁都可以读取到
当前最新的数据。

一致性读+行锁:
按照案例解析,第一个进行事务开启转账的会获取到行锁,此时其他数据进行修改的事
务就会被停住,当然此时如果其他两个事务读的话也读取不到最新的余额。

举反例:这个例子是很多程序员喜欢写的,但是存在很大安全隐患:
给用户账户加500块,如果用户账户没有直接创建用户账户(例子够看就行)

record ,err:= db.query("select balance from user_account where user_id =10");
if err == db.ErrRecordNotExist {
  // 给用户创建账户
  ....
}else{
new_balance = balance +500 
db.query("update user_account set balance =new_balance where user_id= 10")
...
}

其实这个很多场景都能遇到,之前公司业务没考虑到,很多逻辑代码也是这么操作的
之前写php的时候更多都是这么操作的。其实整体逻辑都是有漏洞的,这类逻辑应该在
用户创建的时候就应该使用服务进行相关数据插入。修改数据尽可能使用for update,
或者直接在语句上修改:set balance=balance+500。不然容易出现数据错乱的bug,还
比较难以排查。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容

  • https://blog.csdn.net/iteye_12828/article/details/8193449...
    suxin1932阅读 515评论 0 0
  • 一、事务及其特性 首先看看什么是事务?事务具有哪些特性?关于事务,上大学的时候,你应该有接触过相关的课程。简单来说...
    四街的1024阅读 941评论 0 0
  • 1、前言 相信工作了一段时间的同学肯定都用过事务,也都听说过事务的4大特性ACID。ACID表示原子性、一致性、隔...
    蹲厕所的熊阅读 1,794评论 1 8
  • 表情是什么,我认为表情就是表现出来的情绪。表情可以传达很多信息。高兴了当然就笑了,难过就哭了。两者是相互影响密不可...
    Persistenc_6aea阅读 123,977评论 2 7
  • 16宿命:用概率思维提高你的胜算 以前的我是风险厌恶者,不喜欢去冒险,但是人生放弃了冒险,也就放弃了无数的可能。 ...
    yichen大刀阅读 6,030评论 0 4