设为首页 收藏本站
查看: 995|回复: 0

[经验分享] MySQL 事务

[复制链接]

尚未签到

发表于 2018-10-5 07:04:38 | 显示全部楼层 |阅读模式
  银行引用是事务的一个经典例子:假如银行有两张表,一张支票表,一张储蓄表,现在需要从Jones用户的支票账户转移200¥ 至储蓄账户,那么至少需要三步:
  1.  检查Jones的支票账户余额是否大于200¥
  2.  Jones的支票账户-200¥
  3.  Jones的储蓄账户+200¥
  上述三步可组成一个事务,当2、3步故障时,之前执行的操作会自动回滚,保证数据的一致性。


一、MySQL事务

  MySQL事务是一组SQL语句或一个独立运行的工作单元并且满足ACID测试。
  ACID测试:
  A.atomicity,原子性,一个事务必须作为不可分割的最小单元,事务中的语句要么都执行成功,要么都执行失败。
  C.consistency,一致性,数据库总是从一个一致性状态到另一个一致性状态(数据库的结果是一致的,所有事务中SQL语句共同修改后的结果)不可能因为系统奔溃出现上述支票表-200¥而储蓄表未+200¥,未提交的事务并不会保存至数据库中。
  I. isolation ,隔离性,当前事务操作过程对于另一个线程事务的可见度,由隔离级别决定。
  D. durability , 持久性 , 所有事务提交后都永久存放于数据库中。

  隔离级别:
  1. READ UNCOMMITTED (读未提交)
  2. READ COMMITTED(读提交)
  3. REPEATEABLE READ(可重复读)
  4. SERIALIZABLE(序列化)
  各个隔离级别可能产生的问题:
  

a.脏读,当前线程事务可以读取另一个线程事务未提交修改的数据。  
b.不可重复读,事务提交前看到的数据不一致(别的线程修改提交); 线程1开启事务查询数据一个样,当线程2开启事务修改提交后,线程1再次查询发现数据修改(未提交),这就是不可重复读。
  
c.幻读, 可重复读级别通过MVCC机制保证事务提交前看到的数据都是一致的,但是又有一个新问题,当线程2修改完数据提交后,线程1看到的还是未修改前的原始数据,但实际底层数据已被更改,当线程1提交后发现数据改变,像幻觉一样,这就是幻读。
  
d.加锁读,SERIABLIZEBLE 为了解决幻读问题,当线程事务1查询数据,线程事务2修改数据会被锁住,因为数据具有不确定性。
  

DSC0000.jpg

  事务相关的命令:
  

START   TRANSACTION       #开启事务  
ROLLBACK        #回滚事务
  
COMMIT             #提交事务

  
SAVEPOINT>
  
ROLLBACK [WORK] TO [SAVEPOINT]>
  
RELEASE SAVEPOINT>  

二、验证各事务隔离级别存在的问题:
  1. READ UNCOMMITTED ——幻读
  a.首先需要关闭事务自动提交功能
DSC0001.jpg

  b.修改事务隔离级别为READ-UNCOMMITTED
DSC0002.jpg

  c.开启事务功能
DSC0003.jpg

  d.在一线程事务中修改数据但不提交,在另一线程查看数据已更改,这就是脏读,存在脏读就必然存在不可重复读、幻读问题。
DSC0004.jpg

  2. READ COMMITTED——解决脏读,新问题:不可重复读
  a. 修改事务级别为 READ-COMMITTED .
DSC0005.jpg

  b. 开启事务,并在一线程中删除数据,另一线程查看发现数据已更改,这就是不可重复读。
DSC0006.jpg

DSC0007.jpg

  3. REPEATEABLE READ——解决不可重复读,新问题:幻读
  a.修改事务级别为REPEATABLE-READ
DSC0008.jpg

  b.开启事务、并查询数据
DSC0009.jpg

  c.线程2删除数据并提交,线程1事务未提交查看数据发现未改变(可重复读)
DSC00010.jpg

  d.线程1提交事务发现数据已被改变,这就是幻读,事务提交前数据已被改变,但无法察觉到,事务未修改提交后却发现数据改变
DSC00011.jpg

  4. SERIALIZABLE——解决幻读,新问题:加锁读
  a.设置隔离级别为SERIALIZABLE,在线程1查看数据,线程2修改数据发现被锁住了,因为无法保证线程1事务提交后看到的数据一致,这就是加锁读
DSC00012.jpg

  注意:需要先关闭autocommit=OFF ,并且需要在线程SELECT查看一次才能做出加锁效果。



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-612368-1-1.html 上篇帖子: Yearning和inception搭建MySQL审核平台 下篇帖子: MySQL 5.7.22 二进制安装
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表