道者编程

MYSQL事务隔离级别

一:先熟悉几个概念:

1:四个特性

(1)原子性:要么全部完成,要么全部不完成,不能某些完成某些不完成,不能卡在某个中间环节。

(2)一致性:数据状态一致性,假设事务失败了,那么事务回滚,数据必须回到开始之前,好像没动过一样,这叫一致性。因为有原子性所以就有一致性。原子性是因,一致性是过。

(3)持久性:事务所做的修改持久化保存,不会丢失。

(4)隔离性:多个事务同时运行时,每个事务都应该被隔离,并且不能相互干扰。换句话说,每个事务应该以某种方式被单独执行,不受其他事务的影响,以确保数据的一致性和可靠性。

好了,回到正题,事务的隔离级别,就是说的上面第(4)点隔离性,怎么隔离呢?

二:并发造成的问题

如果不隔离,那就可能遇到并发,MYSQL事务并发处理的问题:脏读、不可重复读、幻读

(1)脏读(dirty read):指从未提交的事务读取了其他事务已修改,但未提交的数据。原因:未提交

比如:事务A正在修改某个值,但还未提交,这时候事务B也过来读取这条数据,那么事务B读取到的数据就有问题,我已经修改了只是没来得及提交,你这时候闯进来读取的数据可能就是无用数据啊,这条数据被事务A执行的时候“弄脏了”,所以叫脏读。

(2)幻读(phantom read):指在同一个事务中,相同的查询操作返回了不同的结果,导致事务的结果不一致。INSERT

比如:在查询相同条件的数据时,事务A先执行查询操作,然后事务B插入了符合该条件的数据行,接着事务1再次执行相同的查询操作,结果就意外地多出了一行,好像幻觉一样。

(3)不可重复读(Non-Repeatable Reads):同一个事务内两次读取同一行数据,但是得到的结果不一致的情况。比如:事务A在多次读取的时候,其他事务把该数据修改,或者删除了。 UPDATA 和 DELETE

三:事务的4种隔离级别:读未提交、读已提交、可重复读、串行

隔离级别 备注脏读不可重复读幻读
读未提交
READ UNCOMMITTED
最低级别可能可能可能
读已提交
READ COMMITTED
语句级不可能可能可能
可重复读
REPEATABLE READ
事务级,默认级别不可能不可能可能
串行
Serializable
最高级,性能最差不可能不可能不可能

MySQL 默认的级别是:Repeatable read 可重复读,其他主流数据库,如Oracle;SQLServer默认级别为:Read committed

四:修改隔离级别:

1:全局修改;my.cnf

1 #可选参数有:READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE.
2 [mysqld]
3 transaction-isolation = REPEATABLE-READ #mysql默认就是这个
 2:当前修改,重启mysql后失效

mysql> set tx_isolation='read-committed';
 


最新评论:
1楼 广东省深圳市 电信 发表于 2021-03-04 16:09:37
牛牛牛
共有 1 条记录  首页 上一页 下一页 尾页 1
我要评论:

看不清楚