MySQL事务

本文详细介绍了MySQL的事务处理,包括ACID特性、事务的隔离级别以及并发读可能出现的问题,如脏读、不可重复读和幻读。讨论了不同隔离级别下这些问题的解决方案,并提到了MVCC在并发控制中的作用。同时,文章还涉及了数据库的锁机制和死锁问题,以及MySQL在高并发场景下的优化策略,如分库分表和NewSQL分布式数据库。
摘要由CSDN通过智能技术生成

MySql的事务

MySQL连接过程

客户端发起请求

MySQL主线程把客户端fd添加到select里

select选择适当时候接受clientfd

MySQL分配连接线程去处理客户端请求

子线程任务:循环读取sql语句,执行语句

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-k6qCtXZ4-1652670601625)(C:\Users\8208191402\AppData\Roaming\Typora\typora-user-images\image-20220403142340798.png)]

事务的目的

数据库需要数据的完整性(约束;主键,自增,外键,触发器)

确保数据库从一个一致性状态转换到另一个一致性状态,确保数据库完整性。

事务的特性(ACID)

原子性A:一系列操作序列,要么都做(commit),要么都不做(rollback)。

一致性C:一致性检测(完整性约束检测),数据库需要数据的完整性(约束;主键,自增,外键,触发器)

一致性是其他三个特性共同来维持的

隔离性I:

描述:(各个事务之间的影响程度)(锁粒度)

目的:当多个事务访问同一资源,限制各事务对该资源的访问行为。

策略:写加锁,读不加,采用版本机制(MVCC,每行数据有一个版本)

作用:在一定程度破坏一致性的前提下,提高MySQL性能

隔离级别:

1.最高:可串行,读写都加锁(serializable),不会影响一致性,下面的都会一定程度影响一致性

2.其次:repeatable read,可重复读,读采用MVCC,写加锁。幻读问题

MVCC采用读取事务开始之前的版本。(在事务过程中,其他事务对记录的修改不会被本事务读取到)

快照读:读取事务开始之前的版本,而且事务内部不会修改记录。

当前读,随着事务内部sql语句的执行,读取被当前事务修改的记录数据。

3.再次:read committed,读已提交,读采用MVCC,写加锁,不可重复读,幻读问题

MVCC采用读取事务最新的版本。(事务内sql1和sql2之间,被事务外sql3修改了记录,sql2读取sql3修改后的记录)

4.read uncommitted,读未提交,读不加锁,写加锁,不采用MVCC,脏读,不可重复读,幻读问题

并发读异常

脏读:读到了其他事务还没提交的数据,

原因:没有用MVCC,只有在DML执行完才会产生版本号。

事务内的每条sql语句,在不使用存储过程的情况下,相当于在网络上走了一个来回。

主数据库使用rr,从数据库用ru提高效率。

不可重复读

隔离级别:读已提交

一个读操作和一个写操作造成的:一个事务读到另一个事务已经commit的数据。

某一行数据两次读,结果不一致。(事务对数据进行update)

执行序列实例

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bkOlCUGB-1652670601627)(C:\Users\8208191402\AppData\Roaming\Typora\typora-user-images\image-20220403160254175.png)]

幻读

隔离级别:可重复读

两次查询得到的结果集合不一致(事务对数据进行delete和insert)

数量不一致:删除/插入

内容不一致:先插入再删除

执行序列实例

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TtXU1784-1652670601628)(C:\Users\8208191402\AppData\Roaming\Typora\typora-user-images\image-20220403160503806.png)]

总结:

不可重复读和幻读都是其他事务对本事务操作数据进行修改导致的。

1.隔离级别

读已提交:MVCC,读取最新版本

可重复读:MVCC,快照读,读取事务之前的版本

2.出现的范围

不可重复读:一行记录

幻读:结果集

3.原因

不可重复读:update

幻读:delete,insert

4.解决:

不可重复读:提高隔离级别即可解决。

幻读:把快照读(MVCC来实现)改成当前读(给读加锁实现)。

select * from table where ... for update;  加读锁
select * from table where ... lock in share mode;	加写锁

手动加锁,就是当前读

insert into ... values ...  虽然是插入语句,但是要先找到插入的位置,还是包含了读操作
update ... set ... ... where ...
delete from where 

快照读转当前读,就是在select语句后面加上lock in share mode;读锁即可

持久性D:落盘,系统重新加载时,可以获取之前的事务提交记录和数据变更。

并发死锁

前提:并发,采用连接池 或 多个server发起MySQL连接时

在这里插入图片描述

在这里插入图片描述

S锁:若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他事务只能再对A加S锁,而不能加X锁,直到T释放A上的S锁。

这保证了其他事务可以读A,但在T释放A上的S锁之前不能对A做任何修改。

X锁:若事务T对数据对象A加上X锁,事务T可以读A也可以修改A,其他事务不能再对A加任何锁,直到T释放A上的锁。

这保证了其他事务在T释放A上的锁之前不能再读取和修改A。

AI锁:自增锁。

在这里插入图片描述

第二种多出现在RR隔离级别下(引入间隙锁)

集群方案

mysql:分库分表,MyCat,介于server和MySQL server之间的代理。

在这里插入图片描述

难以管理

引出NewSQL:分布式关系型数据库。

组成:分布式系统(便于横向扩展) + 关系型sql + 分布式事务XA

关系型数据库的两种用途:OLAP(在线业务分析),OLTP(在线业务处理)(用到XA)

QL server之间的代理。

[外链图片转存中…(img-4ExF534t-1652670601631)]

难以管理

引出NewSQL:分布式关系型数据库。

组成:分布式系统(便于横向扩展) + 关系型sql + 分布式事务XA

关系型数据库的两种用途:OLAP(在线业务分析),OLTP(在线业务处理)(用到XA)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星辰的野望

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值