MySql的事务
MySQL连接过程
客户端发起请求
MySQL主线程把客户端fd添加到select里
select选择适当时候接受clientfd
MySQL分配连接线程去处理客户端请求
子线程任务:循环读取sql语句,执行语句
事务的目的
数据库需要数据的完整性(约束;主键,自增,外键,触发器)
确保数据库从一个一致性状态转换到另一个一致性状态,确保数据库完整性。
事务的特性(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)
执行序列实例
幻读
隔离级别:可重复读
两次查询得到的结果集合不一致(事务对数据进行delete和insert)
数量不一致:删除/插入
内容不一致:先插入再删除
执行序列实例
总结:
不可重复读和幻读都是其他事务对本事务操作数据进行修改导致的。
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)
|