ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

03 : mysql事务隔离问题

2021-05-14 16:01:16  阅读:115  来源: 互联网

标签:语句 03 事务 隔离 回滚 提交 mysql 数据


1.事务的特性:acid 原子性 一致性 隔离性 持久性

2.事务的隔离级别:读未提交 读已提交 可重复读 串行化

3.事务可能出现的问题:
(1)读未提交可能出现脏读,在执行了一个修改的操作的时候,这时候还没有提交事务,就直接可以看到了修改的结果。隔离级别提高可以避免
(2)读已提交可能出现不可重复读的问题,事务A先读取了一条数据,然后执行逻辑的时候,事务B对这条数据进行了修改,然后提交事务,这时候A再次读取这条数据,会发现两次数据是不一致的,隔离级别提高可以避免
(3)可重复读会造成幻读,事务A根据id查询了M条数据,然后事务B插入了除了这M条数据之外的N条数据,这时候事务A再次查id会有M+N条数据,间隙锁处理。

4.可重复读场景:假设你在做数据校对的时候,即使用户有产生了新的数据,也不会影响当前的数据和之前数据进行比对产生了影响

5.事务隔离的实现:主要以可重复读为准,在mysql中,每条记录更新的时候会记录一条日志redolog,同时也会记录一条回滚的日志undolog,假设数据最初为2,在视图A中变成1,然后经过B C到当前值4,这里一共有四个视图,同一个记录在系统中存在了多个版本,就是MVCC,这时候就算有一个事务给数据变成5,也不会影响A B C 里面的值,当没有事务再会使用这些回滚的日志的时候,会删除视图,系统自己判断。

在这里插入图片描述

6.为什么不使用长事务:长事务可能会存在很长的事务,然后回滚记录也会保存,占用大量的资源,同时长事务还会占用锁资源,可能会拖垮了整个库

7.事务的启动方式:
(1)显式启动事务语句, begin 或 start transaction。配套的提交语句是 commit,回滚语句是 rollback。
(2)set autocommit=0,这个命令会将这个线程的自动提交关掉。意味着如果你只执行一个 select 语句,这个事务就启动了,而且并不会自动提交。这个事务持续存在直到你主动执行 commit 或 rollback 语句,或者断开连接

备注:参考极客时间MySQL45讲做的笔记

标签:语句,03,事务,隔离,回滚,提交,mysql,数据
来源: https://blog.csdn.net/weixin_42127238/article/details/116794055

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有