在线精品99_中国九九盗摄偷拍偷看_91免费版在线观看_91.app_91高清视频在线_99热最新网站

怎么在mysql中实现事务的隔离级别

116次阅读
没有评论

共计 2877 个字符,预计需要花费 8 分钟才能阅读完成。

自动写代码机器人,免费开通

这篇文章给大家介绍怎么在 mysql 中实现事务的隔离级别,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

事务就是一组一起成功或一起失败的 sql 语句。事务还应该具备,原子性,一致性,隔离性和持久性。

一、事务的基本要素 (ACID)

1、原子性:事务开始后,所有的操作,要么全部成功,要么全部失败,不可能处于中间状态,事务是一个不可分割的整体,就像原子一样。

2、一致性:事务开始前和结束后,数据库的完整性约束没有破坏,A 向 B 转账,A 扣了钱,但 B 却没到账。

3、隔离性:同时发生的事务 (并发事务) 不应该导致数据库处于不一致的状态中,每个事务都独立执行,不影响其他事务的存在。

4、持久性:事务对数据库的更改都会保存在磁盘上,不会丢失。

二、事务的并发问题

1、脏读:事务 A 读取了事务 B 未提交的写入数据,读取到的数据就称为脏数据

2、不可重复读:事务 A 多次读取同一数据,但在读取过程中,事务 B 对数据做了修改,并提交了。导致多次读取同一数据,结果不一样。

3、幻读:事务 A 对表中所有数据行进行了修改,比如设置 status = 1,但同时,事务 B 往该表插入了一行新数据 status = 0,对于操作事务 A 的用户而言,表中还有一条记录没被修改,就像发生幻觉一样。

三、事务隔离性的四个级别

事务隔离级别脏读不可重复读幻读读取未提交 read uncommitted√√√读已提交 read committed×√√可重复读取 repeatable read××√序列化 serializable×××

四、获取和设置数据库隔离级别

SHOW VARIABLES LIKE  %isolation% 
SHOW GLOBAL VARIABLES LIKE  %isolation%

使用系统变量查询

SELECT @@GLOBAL.tx_isolation;
SELECT @@SESSION.tx_isolation;
SELECT @@tx_isolation;

对于 mysql8 而言,使用下面的变量进行查询

SELECT @@GLOBAL.transaction_isolation;
SELECT @@SESSION.transaction_isolation;
SELECT @@transaction_isolation;

设置隔离级别

SET GLOBAL tx_isolation =  隔离级别 
SET SESSION tx_isolation =  隔离级别 
SET @@tx_isolation =  隔离级别

对于 mysql8 而言,使用下面语句进行设置

SET GLOBAL transaction_isolation =  隔离级别 
SET SESSION transaction_isolation =  隔离级别 
SET @@transaction_isolation =  隔离级别

五、通过例子说明各隔离级别的情况

先准备一张表,和一点数据。

CREATE TABLE `account` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT  ID ,
 `name` varchar(32) DEFAULT   COMMENT  名称 ,
 `money` decimal(11,2) DEFAULT  0.00  COMMENT  金钱 ,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
INSERT INTO `account` (`name`, `money`) VALUES ( A ,  500.00 
INSERT INTO `account` (`name`, `money`) VALUES (B ,  100.00

1、读取未提交

set transaction_isolation =  READ-UNCOMMITTED 
set autocommit = 0;

怎么在 mysql 中实现事务的隔离级别

事务 B 修改了表中的数据,但是未提交,事务 A 确读取到了修改后的数据。如果因为某些原因,事务 B 回滚了,事务 A 读取的这个数据就是脏数据。

2、读已提交

set transaction_isolation =  READ-COMMITTED 
set autocommit = 0;

怎么在 mysql 中实现事务的隔离级别

事务 B 修改数据但没有提交,那么事务 A 仍然获取的原来数据,解决了脏读的问题。

但是事务 B 提交,事务 A 执行上一次查询,结果与上一次查询不一致,这就产生不可重复读的问题。

怎么在 mysql 中实现事务的隔离级别

3、可重复读取

set transaction_isolation =  REPEATABLE-READ 
set autocommit = 0;

怎么在 mysql 中实现事务的隔离级别

事务 B 修改了数据并提交了,事务 A 两次查询的结果是一致的,解决了不可重复读的问题。

这个时候,事务 A 去修改 name 为 A 的 money 数据

怎么在 mysql 中实现事务的隔离级别

name 为 A 的 money 变成了 350,而不是 400,可重复读保证了数据的一致性。

我们重新在事务 A 中修改所有账号的 money 等于 200,同时在事务 B 中插入一条新的数据。

怎么在 mysql 中实现事务的隔离级别

事务 A 中获取的仍然是两条数据,解决了新增数据时,事务 A 出现的幻读问题。

4、序列化

set transaction_isolation =  SERIALIZABLE 
set autocommit = 0;

怎么在 mysql 中实现事务的隔离级别

事务 A 对表进行查询,如果没有提交,则事务 B 的插入语句一直等待在那里,直到超时或事务 A 提交。

反之,事务 B 对表进行插入后,没有提交,则事务 A 对表的查询也一直等待,直到事务 B 提交。

此时对表的读写都会进行锁表,当然对并发性能的影响也比较大。

隔离级别越高,越能保证数据的完整性和一致性。

六、mysql 的锁

锁分为两种类型:

内部锁:mysql 服务器内部执行的内部锁,以管理多个会话对表内容的争用。

外部锁:mysql 为客户会话提供显式地获取表锁,以阻止其他会话访问表。

内部锁又会为两种类型:

1、行级锁:行级锁是细粒度的,只有被访问的行会被锁定,这允许多个会话同时进行写访问。

2、表级锁:mysql 对 myisam,memory 和 merge 表使用表级锁,一次只允许一个会话更新表,这使得这些存储引擎更适用于以读取为主的操作。

外部锁:可以使用 LOCK TABLE 和 UNLOCK TABLE 来控制锁定。

READ (共享锁):多个会话可以从表中读取数据而不需要获取锁,此外,多个会话可以在同一表上获得锁,当 READ 锁时,没有会话可以将数据写入表中。任何写入操作都将处于等待状态,直到 READ 锁被释放。

WRITE (排他锁):当表被 WRITE 锁定时,除持有该锁的会话外,其他会话都不能读取或写入数据,除非 WRITE 锁被释放。

锁表的语句:

LOCK TABLES table_name [READ | WRITE];

解锁表的语句:

UNLOCK TABLES;

锁定数据库中所有表:

FLUSH TABLES WITH READ LOCK;

关于怎么在 mysql 中实现事务的隔离级别就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

向 AI 问一下细节

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-12-04发表,共计2877字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)
主站蜘蛛池模板: 亚洲人成人无码www 亚洲人成人一区二区三区 亚洲人成人伊人成综合网无码 | 日韩在线专区 | 小泽玛利亚的一级毛片的 | 模特精品一区二区三区 | 国产亚洲一区二区在线观看 | 国产一区二区不卡免费观在线 | 无码国内精品久久人妻 | 99在线精品免费视频 | 黑人巨大精品欧美 | 久久国产成人亚洲精品影院老金 | 亚洲成av人在线观看天堂无码 | 国产成人av大片在线观看 | 一本大道无码日韩精品影视_ | 中文无码精品a∨在线 | 国产私拍福利精品视频推出 | 在线观看国产wwwa级羞羞视频 | 99热这里有精品 | 久青草影院在线观看国产 | 国产日产人妻精品精品 | 亚洲午夜未满十八勿入网站2 | 天天色操| 成人亚洲国产精品久久 | 亚洲精品国产福利一二区 | 国产午夜精品久久久久九九 | 免费一级国产大片 | 美女久久精品 | 国产国产精品人在线观看 | 国产精品一区二区久久乐下载 | 日本大臿亚洲香蕉大片 | 日韩免费一级 | 九九国产在线视频 | 中文字幕精品一二三四五六七八 | 欧美 激情 另类 自拍 | 日本精品人妻无码77777 | 四虎国产精品成人 | 日日摸夜夜添夜夜添影院视频 | 日本成日本片人免费 | 亚洲欧美韩国日产综合在线 | 国产精品视频九九九 | 少妇人妻无码专区在线视频 | 亚洲午夜久久 |