隔离性是当多个用户并发访问数据库时,比如同时操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离
事务的隔离级别有哪些?
一、概念
- Read uncommitted(读未提交)
- Read Committed(读已提交)
- Repeatable Reads(可重复读)
- Serializable(串行化)
Read uncommitted
读未提交:隔离级别最低的一种事务级别。在这种隔离级别下,会引发脏读、不可重复读和幻读。
Read Committed
读已提交读到的都是别人提交后的值。这种隔离级别下,会引发不可重复读和幻读,但避免了脏读。
Repeatable Reads
可重复读这种隔离级别下,会引发幻读,但避免了脏读、不可重复读。
Serializable
串行化是最严格的隔离级别。在Serializable隔离级别下,所有事务按照次序依次执行。脏读、不可重复读、幻读都不会出现。
二、操作
查看事务隔离级别
SHOW VARIABLES LIKE \'tx_isolation\';
查看全局的事务隔离级别
SHOW GLOBAL VARIABLES LIKE \'tx_isolation\';
使用系统变量查询
SELECT @@global.tx_isolation;SELECT @@session.tx_isolation;SELECT @@tx_isolation;
补充
MySql常用命令
-
查询隔离级别select @@tx_isolation;
-
设置手动提交set autocommit=0 ;
-
查看当前事务自动提交模式select @@autocommit;
-
设置隔离级别set tx_isolation = \'READ-COMMITTED\';
-
查询表的状态show table status like \'test1\';
-
修改表的存储引擎alter table test1 engine = INNODB
-
查看是否开启日志show variables like \'log_bin\';
-
查看日志状态show master status;
3.2 设置MysQL的事务隔离级别
语法
SET [GLOBAL | SESSION] TRANSACTION ISOLATION LEVEL
{
REPEATABLE READ
| READ COMMITTED
| READ UNCOMMITTED
| SERIALIZABLE
}
GLOBAL:设置全局的事务隔离级别SESSION:设置当前session的事务隔离级别,如果语句没有指定GLOBAL或SESSION,默认值为SESSION
使用系统变量设置事务隔离级别
SET GLOBAL tx_isolation=\'REPEATABLE-READ\';SET SESSION tx_isolation=\'SERIALIZABLE\';
如果并发事务没有进行隔离,会出现什么问题?
在多个事务并发做数据库操作的时候,如果没有有效的避免机制,就会出现种种问题。大体上有以下问题:
问题一:脏读
脏读指一个事务读取了另外一个事务未提交的数据。
具体看后文案例介绍
问题二:不可重复读
不可重复读指在一个事务内读取表中的某一行数据,多次读取结果不同。不可重复读和脏读的区别是,脏读是读取前一事务未提交的脏数据,不可重复读是重新读取了前一事务已提交的数据。
具体看后文案例介绍
问题三:幻读(虚读)
幻读(虚读)指在一个事务内读取到了别的事务插入的数据,导致前后读取不一致。
以下都是采用mysql数据库
三、案例
下面实际操作中使用到的一些并发控制语句,可看上面的操作介绍
作为演示:product表(产品表)
产品ID 产品名称 产品价格 产品数量 .
1 | xiaomi | 1999 | 100 |
来源:https://www.cnblogs.com/diaoyulin/p/15114279.html
图文来源于网络,如有侵权请联系删除。