MySQL的事务-隔离级别

2023-12-25 23:56:19

上篇,整理了MySQL事务的原子性,这篇继续整理MySQL事务的一致性、隔离性和持久性。

2. 一致性指的是事务开始前和结束后,数据库的完整性约束没有被破坏,这保证了数据的完整性和一致性。一致性必须确保数据库从一个一致的状态转换到另一个一致的状态。

3. 隔离性指的是在同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰。这保证了并发事务间的互斥性,使得数据在处理过程中不会被其他事务干扰。MySQL支持不同的事务隔离级别:Read Uncommitted, Read Committed, Repeatable Read, Serializable, 这些隔离级别定义了事务如何与其他并发事务交互。较低的隔离级别可以提供更高的并发性能,但可能导致数据不一致问题,如脏读、不可重复读和幻读。而较高的隔离级别可以确保数据的一致性,但可能会限制并发事务的数量。 MySQL的默认隔离级别是 Repeatable Read,这意味着在一个事务内多次读取同一个数据,数据内容时一致的,即使其他事务修改了该数据,也不会影响当前事务的读取结果。

查看mysql的事务隔离级别:

SHOW VARIABLES LIKE 'transaction_isolation';

隔离性体现如下:

(1)如果数据库的事务隔离级别是Read Uncommitted:

由于mysql的默认事务隔离级别是Repeatable Read,先将mysql的默认事务隔离级别改为Read Uncommited

SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

上面的sql只是修改了当前会话的隔离级别,不影响其他会话,修改MySQL的全局默认事务隔离级别如下

SET GLOBAL TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

修改之后,数据库的默认隔离级别变为READ-UNCOMMITTED

打开两个事务,其中一个事务A读取,一个事务B进行修改数据但不提交,

事务B进行修改数据,但不提交

事务A读取到了事务B未提交的数据,这就产生了脏读。

(2)如果数据库的事务隔离级别是Read committed:

修改数据库的默认隔离级别为读已提交Read committed

set global transaction isolation level read committed;

开启事务A和事务B

在事务B中将zhangsan的money修改为3000,不提交事务,在事务B中可以查询到zhangsan的money变成了3000; 但是在事务A中不会查询到未提交的数据,这就可以避免脏读。

但是读已提交会造成不可重复读,如下

(3)如果数据库的事务隔离级别是Repeated read:

修改默认隔离级别

set global transaction isolation level repeatable read;

MySQL的可重复读如何解决幻读,以及快照读、当前读等问题,下一篇继续整理。

4. 持久性指的是事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚。

文章来源:https://blog.csdn.net/flyingcloude/article/details/135188205
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。