本系列为:MySQL数据库详解,为千锋资深教学老师独家创作
致力于为大家讲解清晰MySQL数据库相关知识点,含有丰富的代码案例及讲解。如果感觉对大家有帮助的话,可以【关注】持续追更~
文末有本文重点总结,技术类问题,也欢迎大家和我们沟通交流!
前言
从今天开始本系列内容就带各位小伙伴学习数据库技术。数据库技术是Java开发中必不可少的一部分知识内容。也是非常重要的技术。本系列教程由浅入深, 全面讲解数据库体系。 非常适合零基础的小伙伴来学习。
全文大约 【1505】字,不说废话,只讲可以让你学到技术、明白原理的纯干货!本文带有丰富案例及配图,让你更好的理解和运用文中的技术概念,并可以给你带来具有足够启迪的思考...
一. 事务隔离级别
什么是事务隔离级别呢?对我们的日常操作结果又有什么影响呢?下面带各位小伙伴先来了解下事务隔离级别的概念。
1. 隔离级别的概念
多个客户端操作时 ,各个客户端的事务之间应该是隔离的,相互独立的 , 不受影响的。
如果多个事务操作同一批数据时,则需要设置不同的隔离级别 , 否则就会产生问题 。
2. 四种隔离级别
我们先来了解一下四种隔离级别的名称 , 再来看看可能出现的问题。
1 | 读未提交 | read uncommitted |
---|---|---|
2 | 读已提交 | read committed |
3 | 可重复读 | repeatable read |
4 | 串行化 | serializable |
3. 可能引发的问题
下面总结了数据库中不同事务隔离级别可能引发的问题。各位小伙伴可以参照下:
问题 | 现象 |
---|---|
脏读 | 是指在一个事务处理过程中读取了另一个未提交的事务中的数据 , 导致两次查询结果不一致。 |
不可重复读 | 是指在一个事务处理过程中读取了另一个事务中修改并已提交的数据, 导致两次查询结果不一致。 |
幻读 | select 某记录是否存在,不存在,准备插入此记录,但执行 insert 时发现此记录已存在,无法插入。或不存在执行delete删除,却发现删除成功。 |
4. 数据库隔离级别操作语法
查询数据库隔离级别:
语法:SELECT @@TX_ISOLATION;
修改数据库隔离级别:
语法:SET GLOBAL TRANSACTION ISOLATION LEVEL 级别字符串;
5. 事务隔离级别演示
举个例子:脏读的问题
-- 查询账户表
select * from account;
-- 设置隔离级别为read uncommitted
set global transaction isolation level read uncommitted;
-- 开启事务
start transaction;
-- 转账
update account set money = money - 500 where id = 1;
update account set money = money + 500 where id = 2;
-- 窗口2查询转账结果 ,出现脏读(查询到其他事务未提交的数据)
-- 窗口2查看转账结果后,执行回滚
rollback;
举个栗子:解决脏读的问题和演示不可重复读的问题。
-- 设置隔离级别为read committed
set global transaction isolation level read committed;
-- 开启事务
start transaction;
-- 转账
update account set money = money - 500 where id = 1;
update account set money = money + 500 where id = 2;
-- 窗口2查看转账结果,并没有发生变化(脏读问题被解决了)
-- 执行提交事务。
commit;
-- 窗口2查看转账结果,数据发生了变化(出现了不可重复读的问题,读取到其他事务已提交的数据)
举个栗子:解决不可重复读的问题。
-- 设置隔离级别为repeatable read
set global transaction isolation level repeatable read;
-- 开启事务
start transaction;
-- 转账
update account set money = money - 500 where id = 1;
update account set money = money + 500 where id = 2;
-- 窗口2查看转账结果,并没有发生变化
-- 执行提交事务
commit;
-- 这个时候窗口2只要还在上次事务中,看到的结果都是相同的。
-- 只有窗口2结束事务,才能看到变化(不可重复读的问题被解决)
6. 隔离级别总结
编号 | 隔离级别 | 名称 | 出现脏读 | 出现不可重复读 | 出现幻读 | 数据库默认隔离级别 |
---|---|---|---|---|---|---|
1 | read uncommitted | 读未提交 | 是 | 是 | 是 | |
2 | read committed | 读已提交 | 否 | 是 | 是 | Oracle / SQL Server |
3 | repeatable read | 可重复读 | 否 | 否 | 是 | MySQL |
4 | serializable | 串行化 | 否 | 否 | 否 |
注意: 隔离级别从小到大安全性越来越高,但是效率越来越低 , 所以不建议使用READ UNCOMMITTED 和 SERIALIZABLE 隔离级别。
二. 结语
最后在这里对本文核心要点进行总结:
1. 理解脏读、幻读、不可重复读产生的原因和解决办法。
2. 各位小伙伴熟练记住不同隔离级别以及会导致的问题。
以上就是本文的全部内容了,更多技术类干货,可以持续关注~
标签:事务,隔离,--,money,数据库,read,详解,MYSQL,级别 From: https://www.cnblogs.com/qian-fen/p/17401639.html