VPS测评 VPS推荐 VPS优惠
Linux运维

MYSQL的事务管理和隔离级别详解

事务,又叫transactions,是一组原子性的SQL语句,一个独立的工作单元。

事务特性

事务具有ACID特性。

A:atomicity(原子性)

整个事务中的所有操作要么全部成功执行,要么全部失败回滚,不会存在做了一半的情况。

C:consistency(一致性)

数据库总是从一个一致性状态转换为另一个一致性状态。

I:Isolation(隔离性)

一个事务所做出的操作在最终提交之前,是不能为其它事务所见,类似于博客的草稿;有多种隔离级别,可以修改,实现并发。

D:durability持久性

一旦事务提交,修改会永久保存在数据库中。


事务管理

启动事务,三种命令都可以

BEGIN
BEGIN WORK
START TRANSACTION

结束事务,一般只有两种可能,提交或者回滚

提交

COMMIT

回滚

ROLLBACK

事务隔离级别

MySQL 支持四种隔离级别,事务隔离级别从上至下更加严格。

MYSQL 8.0 可以通过系统变量查询目前的事务的隔离级别

SELECT @@transaction_isolation;
隔离级别脏读不可重复度幻读加读锁
读未提交可以出现可以出现可以出现
读已提交不允许出现可以出现可以出现
可重复读不允许出现不允许出现可以出现
序列化不允许出现不允许出现不允许出现

READ-UNCOMMITTED

可读取到未提交数据,产生脏读。

READ-COMMITTED

可读取到已经提交数据,但未提交数据不可读。产生不可重复读(可读取到多个提交数据),导致每次读取数据不一致。

REPEATABLE-READ

可重复读,多次读取数据都一致,产生幻读(数据已经变了但是你看到的还是旧数据如同幻觉)。即读取过程中,即使有其它提交的事务修改了数据,仍只能读取到未修改前的旧数据,此为MySQL默认的隔离级别,同时兼顾并发和数据安全。

SERIALIZABLE

可串行化,未提交的读事务阻塞修改事务(加读锁,但不阻塞读事务),或者未提交的修改事务阻塞其它事务的读写(加写锁,其它事务的读,写都不可以执行)。并发性能差。


REPEATABLE-READ

默认的第三种隔离级别,可重复读的意思是,假设我在一台服务器的数据库上打开了两个终端,分别开启了两个事务A和事务B。我在事务A往一个表添加了一条记录,在没有提交之前,B事务是读不到这条记录的。这时候我在A事务里面提交了这条记录,这时候表格的数据已经被修改了,但是B事务读到的还是修改前的旧数据。只有当B事务被最终提交commit以后,我在B终端才能看到A添加的记录。B在它自己的事务还没有提交之前,是看不见已经修改的数据的,只能看见旧数据。

这个原理有什么用呢?它可以保证备份数据的一致性。假设一个数据库很大,备份需要持续30分钟,如果备份才进行了一半,数据就被用户修改了,这样的备份就是没有任何意义的。解决方法很简单,先开启备份事务,在备份期间,即使用户对数据库进行各种增删改,备份事务看到的数据始终是某个固定的时间点的,这样保证了备份数据的一致性。


修改隔离级别

方法一:修改系统变量,支持GLOBAL和SESSION

MYSQL 8.0 之前的版本

SET tx_isolation='READ-UNCOMMITTED|READ-COMMITTED|REPEATABLE-READ|SERIALIZABLE'

MYSQL 8.0

SET transaction_isolation='READ-UNCOMMITTED|READ-COMMITTED|REPEATABLE-READ|SERIALIZABLE'

方法二:修改服务器配置文件

[mysqld]
transaction-isolation=SERIALIZABLE

MVCC和事务的隔离级别的关系

MVCC(多版本并发控制机制)只在READ COMMITTED和REPEATABLE READ两个隔离级别下工作。其他两个隔离级别都和MVCC不兼容,因为READ UNCOMMITTED总是读取最新的数据行,而不是符合当前事务版本的数据行。而SERIALIZABLE则会对所有读取的行都加锁。

未经允许不得转载:青蛙主机 » MYSQL的事务管理和隔离级别详解

VPS相关常用工具

PING测试工具自用毛子接码站