栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

MySQL事务

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

MySQL事务

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)

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/893925.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号