这篇文章给大家介绍怎么在mysql中实现事务的隔离级别,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。
事务就是一组一起成功或一起失败的sql语句。事务还应该具备,原子性,一致性,隔离性和持久性。
一、事务的基本要素(ACID)
1,原子性:事务开始后,所有的操作,要么全部成功,要么全部失败,不可能处于中间状态,事务是一个不可分割的整体,就像原子一样。
2,一致性:事务开始前和结束后,数据库的完整性约束没有破坏,向B转账,一个扣了钱,但我却没到账。
3,隔离性:同时发生的事务(并发事务)不应该导致数据库处于不一致的状态中,每个事务都独立执行,不影响其他事务的存在。
4,持久性:事务对数据库的更改都会保存在磁盘上,不会丢失。
二、事务的并发问题
1、脏读:事务一个读取了事务B未提交的写入数据,读取到的数据就称为脏数据
2,不可重复读:事务多一次读取同一数据,但在读取过程中,事务B对数据做了修改,并提交了。导致多次读取同一数据,结果不一样。
3,幻读:事务一个对表中所有数据行进行了修改,比如设置状态=1,但同时,事务B往该表插入了一行新数据状态=0,对于操作事务一个的用户而言,表中还有一条记录没被修改,就像发生幻觉一样。
三、事务隔离性的四个级别
事务隔离级别脏读不可重复读幻读读取未提交读未提交√
√
√
读已提交阅读提交×
√
√
可重复读取可重复读×
×
√
序列化可序列化的×
×
×
四,获取和设置数据库隔离级别
SHOW VARIABLES LIKE & # 39; % % & # 39;隔离; SHOW GLOBAL  VARIABLES LIKE & # 39; % % & # 39;隔离;
使用系统变量查询
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 =, & # 39;隔离级别& # 39;; 时间=SET SESSION  tx_isolation & # 39;隔离级别& # 39;; SET @@tx_isolation =, & # 39;隔离级别& # 39;;
对于mysql8而言,使用下面语句进行设置
SET GLOBAL transaction_isolation =, & # 39;隔离级别& # 39;; 时间=SET SESSION  transaction_isolation & # 39;隔离级别& # 39;; SET @@transaction_isolation =, & # 39;隔离级别& # 39;;
五,通过例子说明各隔离级别的情况
先准备一张表,和一点数据。
CREATE TABLE “帐户”,( ,“id”int (11), unsigned NOT NULL AUTO_INCREMENT COMMENT & # 39; id # 39; ,“名字”varchar (32), DEFAULT & # 39; & # 39;, COMMENT & # 39;名称& # 39;, ,‘钱’小数(11日2),DEFAULT & # 39; 0.00 & # 39;, COMMENT & # 39;金钱& # 39;, ,PRIMARY KEY (id) ),引擎=InnoDB DEFAULT CHARSET=utf8mb4; INSERT INTO “帐户”,(“名字”,,“钱”),VALUES (& # 39;一个# 39;,,& # 39;500.00 & # 39;); INSERT INTO “帐户”,(“名字”,,“钱”),VALUES (& # 39; b # 39;,, & # 39; 100.00 & # 39;);
1,读取未提交
set transaction_isolation =, & # 39; READ-UNCOMMITTED& # 39;; set autocommit =, 0;
事务B修改了表中的数据,但是未提交,事务一个确读取到了修改后的数据。如果因为某些原因,事务B回滚了,事务一个读取的这个数据就是脏数据。
2,读已提交
set transaction_isolation =, & # 39; READ-COMMITTED& # 39;; set autocommit =, 0;
事务B修改数据但没有提交,那么事务一个仍然获取的原来数据,解决了脏读的问题。
但是事务B提交,事务一个执行上一次查询,结果与上一次查询不一致,这就产生不可重复读的问题。