mysql事务及隔离级别

Mysql规定了四个隔离级别

Read uncommit 未提交读,安全隔离级别最差(基本不会用),一个事务会读取到另一个未提交的事务的修改,会带来脏读,幻读,不可重复读等问题;

Read commit 已提交读,一个事务只能读取到另一个事务已提交的修改,避免了脏读,但仍有幻读和不可重复读;

Repeatable read 可重复读,同一个事务中多次读取相同的数据返回结果是一样的,可避免脏读和不可重复读,会有幻读存在;

Serialization 可串行化,事务以串行方式提交,可避免以上所有问题,但是会严重影响数据库性能。

 

何为脏读,不可重复读,幻读

脏读:事务1开启了一个事务,对表A进行修改,在未提交的情况下,事务2查看到了此修改,造成脏读,如果此时事务1回滚事务,那么修改被回滚,事务2再次查看,懵逼;

不可重复读:事务1查询表A,得到结果a,此时,事务2对表A进行了修改 ,将a改为了b,并先于事务1提交,当事务1想将a修改为c时,报错没有匹配到数据,懵逼;

幻读:事务1查询表A,得到结果a,此时,事务2在表A中插入数据c,并提交,当事务1想将a修改为c时,报错主键冲突,懵逼。

 

四种隔离级别的实现原理

Read uncommit :不加任何锁,比较随便,没人用。

Read commit:RC隔离级别下没有gap-lock ,读事务每次都读undo log的最新版本,所以会造成同一数据读到不同的版本,不能重复读数据和幻读。

Repeatable read:可进行重复读,有Next-Key Lock,可以解决幻读问题。

Serialization:直接锁表,就是干,哪那么多花花肠子。

 

总结

我买彩票赢了2000,被老王知道了,说见者有份,给他转点,不然不让我走。没办法我掏出手机,准备微信转账,此时我是事务1,老王跟旁边瞄着偷看我转账,那王八蛋是事务2。我在输入栏写了500,还没点确定(uncommit),心里有点犹豫,老王一看(select),心里乐了,给这么多,高兴地一批,把头转开了,这时我删了一个0rollback),确定(commit),转账,一气呵成。

“老王,我走了啊”,

“去吧去吧”,老王高兴地说。

这叫脏读。

 

老王回家发现被骗了,有点气,正好老婆不在家,准备去超市买点酒,就点下酒菜。但老王脑残啊,他非要把这50先提现到银行卡(select),拿着银行卡就去了,这是事务1。提现一到账,他老婆收着短信了,

“这王八蛋,哪来的钱,赶紧转我微信里(delete/update)”,他老婆躺我怀里高兴地说,这是事务2

再说那边老王正好买了50块钱的东西,一去柜台一刷(select),收银小姐姐说:

“先生,您卡里余额不足”,

“咋可能!我刚看还有50呢”。小姐姐心想,“这王八蛋”。遂吵了俩小时架。

这叫不可重复读。

 

老王老婆完事回了家,感觉有点对不起老王,给他又转了十块。老王走了半路,一看,哎呦,哪来的10块,真开心(select),拿着又回超市了,这是事务1。这回就10块,不敢多买,挑来挑去,又挑了俩小时,付款时候被收银小姐姐一同鄙视,老王羞愧的低下头,

“等老子有钱的”。

老王老婆一看这货还不回家,心里来气,准备把那十块钱转回来,事务2,一输密码,密码错误(can’t update/delete),原来那王八蛋收着钱就把密码给改了,这回没法了。老王老婆又一想,老王头上都绿油油了,要不然再给他点吧,于是又给老王卡里转了40insert)。

那边老王正要付款,一看卡里成了50了(select),那个气啊,正要转身再进去买点,收银小姐姐笑着说,

“不好意思,先生,我们下班了”。

这叫幻读。

posted on 2019-03-29 11:22  小二来个勺  阅读(114)  评论(0编辑  收藏  举报

导航