mysql-事务隔离级别

野性酷女 2022-04-04 10:00 453阅读 0赞

查看事务级别:show variables like ‘tx_isolation’;下述为mysql默认的事务级别——可重复读

20181221231919753.png

改变事务级别:

mysql> set global transaction isolation level read committed; //全局的

mysql> set session transaction isolation level read committed; //当前会话

1、READ UNCOMMITTED 读未提交——脏读

先将事务级别设置为READ UNCOMMITTED

20181221232402462.png

同时开启两个事务。如下图,这个级别下,事务1会读到事务2未提交的内容,称为脏读。

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dyb25neWFv_size_16_color_FFFFFF_t_70

2、READ COMMITTED 读已经提交——不可重复读

为了解决脏读的问题,我们只需要让事务不能访问其它事务未提交的内容。这个级别干的就是这个事。先把事务级别设置成READ COMMITTED

2018122123375273.png

测试:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dyb25neWFv_size_16_color_FFFFFF_t_70 1

上述测试事务1不会读到事务2未提交的更新内容

这个级别会造成另外一个问题,不可重复读:一个事务中两次读取的内容不一样。

事务1读,事务2更新

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dyb25neWFv_size_16_color_FFFFFF_t_70 2

3、REPEATABLE READ 可重复读。

REPEATABLE REDA可重复读级别,在读已提交的基础上,增加了读一致性(这边没有保证更新和插入的一致性,只是导致幻读的根源),即多次读取结果一样。

20181222000321730.png

事务2的更新操作提交以后,事务1任然看不到改变。只有当事务1提交,再次开启事务才能看见。watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dyb25neWFv_size_16_color_FFFFFF_t_70 3

这个锁级别下会造成的问题——幻读,现象如下:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dyb25neWFv_size_16_color_FFFFFF_t_70 4

不可重复读主要是update操作导致,一个事务两次读取,可能会读到不一致的内容。幻读主要是insert和delete导致,导致读取的数据和实际的不一致。

4、SERIALIZABLE 串行

所有事务串行执行。

发表评论

表情:
评论列表 (有 0 条评论,453人围观)

还没有评论,来说两句吧...

相关阅读

    相关 MySQL事务-隔离级别

    事务的并发问题 1. 脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据 2. 不可重复读:事务 A 多次读取同一数据,事务 B 在事务A

    相关 MySQL事务隔离级别

    数据库是多线程并发访问的,所以很容易出现多个线程同时同时开启事务的情况,这样就会出现脏读、重复读及幻读的情况,通过为事物设置隔离级别,来避免这种情况的发生。 在 MySQL