
概述索引是MySQL的数据结构,关系着MySQL如何存储数据,查询数据;而如何操作数据,解决多线程时操作数据带
程序猿阿嘴 2023-05-23 00:05:52
索引是MySQL的数据结构,关系着MySQL如何存储数据,查询数据;而如何操作数据,解决多线程时操作数据带来的问题,则需要通过事务来完成。
【资料图】
InnoDB引擎支持事务,MyISAM引擎不支持事务
事务是由一组SQL语句组成的逻辑处理单元,事务具有以下4个属性,通常简称为事务的ACID属性
原子性(Atomicity):事务是一个原子操作单元,其对数据的修改,要么全都执行,要么全都不执行。 一致性(Consistent) :在事务开始和完成时,数据都必须保持一致状态。 隔离性(Isolation):数据库系统提供一定的隔离机制,保证事务在不受外部并发操作影响的“独立”环境执行。 持久性(Durable):事务完成之后,它对于数据的修改是永久性的。用大白话说:
原子性:事务里的所有操作,要么是commit全部提交成功,要么是rollback全部回滚。 一致性:个人认为更多在于业务操作,如A用户向B用户转账100,必须是A-100, B+100,不能出现A转账成功,B未收到情况。 隔离性:A事务在操作数据时,不受B事务影响。这点会在本文详细说明。 持久性:对数据的所有成功操作,都会落到磁盘上。InnoDB中,一共有四种隔离级别:读未提交、读已提交、可重复读、可串行化。默认为可重复读。
它们分别会对应一些并发问题,如表格所示:
隔离级别 | 脏读 | 不可重复读 | 幻读 |
读未提交 | 有可能 | 有可能 | 有可能 |
读已提交 | 不可能 | 有可能 | 有可能 |
可重复读 | 不可能 | 不可能 | 有可能 |
可串行化 | 不可能 | 不可能 | 不可能 |
下面将对这些问题做详细解释
在该隔离级别下,事务A可以读到事务B尚未提交的数据。
设置方式:
sql复制代码set tx_isolation="read-uncommitted";
如以下事务A先进行查询用户数据, 此时jack的余额为10
事务B修改jack的余额为20
sql复制代码begin;update account set balance = balance + 10 where id = 1;
注意:此时事务B并未提交
事务A再次查询,发现jack的余额已变为为20
若此时事务A用该数据进行业务处理,比如购买商品,完成之后,事务B发生回滚。那么就相当于事务A用了错误的数据进行了业务。
在该隔离级别下,事务A可以读到事务B已经提交的数据。
设置方式:
sql复制代码set tx_isolation="read-committed";
如以下事务A先进行查询用户数据, 此时jack的余额为10
事务B修改jack的余额为20
sql复制代码begin;update account set balance = balance + 10 where id = 1;
注意:此时事务B并未提交
事务A再次查询,jack的余额仍然为10
此时事务B提交数据,事务A再次查询,发现jack的余额变为了20
此时就会带来一个新的问题:在事务A中,明明没有对该条数据做任何修改,但多次查询发现数据一直变化,就会给人带来疑惑:我到底应该用哪个数据完成业务呢?
在该隔离级别下,事务A每次查询的数据都和第一次查询的数据相同。
设置方式:
sql复制代码set tx_isolation="repeatable-read";
如以下事务A先进行查询用户数据, 此时jack的余额为10
事务B修改jack的余额为20, 并且提交数据
sql复制代码begin;update account set balance = balance + 10 where id = 1;commit;
注意:此时事务B已经提交了
事务A再次查询,jack的余额仍然为10
在其他事务中查询,可以发现其实jack的余额已经是20了
现在,尝试在事务A中查询id<5的数据,此时只查出两条数据
在 其他事务 中插入一条id=4的记录并提交
sql复制代码INSERT INTO `account` (`id`, `name`, `balance`)VALUES(4, "zhangsan", 30);
在事务A中更新id=4的数据,注意,更新的是id=4的数据
然后再次尝试查询id<5的数据,此时发现多出了一条id=4的数据
在同一个事务里,重复查询同一条数据,数据不会发生改变,这是可重复读。
但是存在可以更新一条“不存在”的数据,然后把它查出来,这是幻读。
对于该事务来说不存在
在该隔离级别下,执行任何sql都是串行的(加锁)。
设置方式:
sql复制代码set tx_isolation="serializable";
如以下事务A先进行查询用户数据, 此时jack的余额为10
在事务B中尝试修改该条数据,你会发现,锁住了
在该隔离级别,执行任何sql,包括查询sql,MySQL都会给你加上一把锁,让所有的操作都成线性的,这便是可串行化。
该隔离级别性能极低,不建议使用。
在本章节中,简单介绍了MySQL的四种隔离级别和他们所带来的问题。
最后再说一点关于读已提交和可重复读的想法:
在读已提交的隔离级别下,虽然说在同一事务中,存在数据发生变化的情况,但实际在开发时,很少会重复查询同一条数据,所以问题其实不大,并且读已提交的性能要比可重复读要好一些,如果想要提升性能,业务又不存在或者不在意极端的情况,可以考虑使用读已提交的隔离级别。
如果我的文章对你有所帮助,还请帮忙 点赞、收藏、转发 一下,你的支持就是我更新的动力,非常感谢!
原文链接:https://juejin.cn/post/7195001501213786171
概述索引是MySQL的数据结构,关系着MySQL如何存储数据,查询数据;而如何操作数据,解决多线程时操作数据带
掌上曲靖讯(曲靖日报记者杨紫羽)5月22日上午,曲靖市在马龙区滇中好运物流集团召开运八网络货运平台推介
欠钱9900,还了一百块之后就没动静了怎么办
在发表这番言论之际,路透社报道,拜登已于21日就美国债务上限问题同众议院议长凯文·麦卡锡通话
当地时间5月21日,印度国产新版VandeBharat“半高铁”列车遭遇雷暴袭击,造成受电弓故障,列车挡风玻璃和驾驶室
崩坏星穹铁道镜流几星?游戏中,镜流的属性为冰、职业毁灭,是一个5星角色,战斗时可以对目标造成冰伤并叠加
Herewego!罗马诺:曼城即将与刘易斯续签长约,曼城,刘易斯,罗马诺,瓜迪奥拉,意大利媒体
基于降本增效,叮咚买菜(NYSE:DDL)撤出川渝两地。5月22日,澎湃新闻记者发现,叮咚买菜APP将定位切换到成都
一旦来到夏天,我们就会想到各种各样的裙装,裙子确实是夏日必不可少的氛围感单品,但是不是只能穿裙子,如
1、烟灰缸可以放水,没有什么不可以,主要估计对方让你不要放水是嫌你弄得乱恶心很脏……借口风水只是给你
时至立夏,万物繁茂,正是放育虾苗的好季节。在津南区双桥河镇西泥沽村俊东伟业合作社养殖基地内,工人们正
市场仍有震荡整理的需求,但中长期看,市场走势依然看好。
松果财经获悉,天眼查App显示,近日,上海苏宁易购商业管理发展有限公司发生工商变更,企业名称变更为南京
券商评级是指证券公司的分析师,通过分析上市公司的财务潜力、财务指标、公司运营治理能力,然后进行实地考
1、你打开解压包看看如果里面显示的是datamapGraphics三个文件夹那就直接解压到盛大传奇的客户端中