MySql教程

03 : mysql事务隔离问题

本文主要是介绍03 : mysql事务隔离问题,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

1.事务的特性:acid 原子性 一致性 隔离性 持久性

2.事务的隔离级别:读未提交 读已提交 可重复读 串行化

3.事务可能出现的问题:
(1)读未提交可能出现脏读,在执行了一个修改的操作的时候,这时候还没有提交事务,就直接可以看到了修改的结果。隔离级别提高可以避免
(2)读已提交可能出现不可重复读的问题,事务A先读取了一条数据,然后执行逻辑的时候,事务B对这条数据进行了修改,然后提交事务,这时候A再次读取这条数据,会发现两次数据是不一致的,隔离级别提高可以避免
(3)可重复读会造成幻读,事务A根据id查询了M条数据,然后事务B插入了除了这M条数据之外的N条数据,这时候事务A再次查id会有M+N条数据,间隙锁处理。

4.可重复读场景:假设你在做数据校对的时候,即使用户有产生了新的数据,也不会影响当前的数据和之前数据进行比对产生了影响

5.事务隔离的实现:主要以可重复读为准,在mysql中,每条记录更新的时候会记录一条日志redolog,同时也会记录一条回滚的日志undolog,假设数据最初为2,在视图A中变成1,然后经过B C到当前值4,这里一共有四个视图,同一个记录在系统中存在了多个版本,就是MVCC,这时候就算有一个事务给数据变成5,也不会影响A B C 里面的值,当没有事务再会使用这些回滚的日志的时候,会删除视图,系统自己判断。

在这里插入图片描述

6.为什么不使用长事务:长事务可能会存在很长的事务,然后回滚记录也会保存,占用大量的资源,同时长事务还会占用锁资源,可能会拖垮了整个库

7.事务的启动方式:
(1)显式启动事务语句, begin 或 start transaction。配套的提交语句是 commit,回滚语句是 rollback。
(2)set autocommit=0,这个命令会将这个线程的自动提交关掉。意味着如果你只执行一个 select 语句,这个事务就启动了,而且并不会自动提交。这个事务持续存在直到你主动执行 commit 或 rollback 语句,或者断开连接

备注:参考极客时间MySQL45讲做的笔记

这篇关于03 : mysql事务隔离问题的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!