mysql事务特点总结

Posted xiaoxlm

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql事务特点总结相关的知识,希望对你有一定的参考价值。

1.mysql事务有4个隔离级别,以及会出现的问题如下图:

技术分享图片

2. 脏读:

开启事务A,B。事务A在还没有提交的情况下,假如第一次查询id=1的用户的age=24。事务B执行了update 表 set age = 100 where id = 1; B事务并没有提交,紧接着再次查询id=1的用户的age时,age变成了其他值,这时事务A中出现了脏读。

解决办法: 在事务中,读取数据的时候加共享锁。 select ... lock in share mode;

3. 不可重复读:

什么是不可重复读?举例说明,两个事务A, B。两个事务查询结果都是id=1的用户age=24,id=2的用户age=25。这时A执行update 表 set age = 100 where id = 1; 这时A还没有提交,B也没有提交,B来查询id=1的用户age还是=24,然后A执行commit。此时B再次查询id=1的用户的age就=100,事务B并没有重复读取到之前id=1记录的状态。

不可重复读和脏读的区别就在于,修改了数据的事务有没有执行commit。没有提交,另一事务数据隔离性出现问题叫脏读;提交了,另一事务数据隔离性出现问题叫不可重复读。

解决办法:给每个事务增加客户端快照--可重复读隔离级别。

4. 幻读:

两个事务A,B。两个事务一开始 select * from ‘表‘ 查询出来的数据都是一样的,假如是5行记录,把这时数据状态称为"数据状态1"。这时,事务Ainsert一条记录,然后commit。这时B查询select * from ‘表‘,数据还是"数据状态1",5行数据,然后执行update ‘表‘ set column=‘xxx‘,看下面返回的Rows matched: 会是6,比5行多一行!然后再执行select * from ‘表‘,返回了6行数据!多出了一行,好像之前5行的数据是幻觉一样。这种情况,就叫幻读。

解决办法: mvcc,多版本控制,也叫乐观锁。

 

5.查看会话的隔离级别:

select @@global.tx_isolation;

6. 修改会话的隔离级别:

set tx_isolation=‘read-committed‘;

7. 可串行化隔离级别最高,通过对更改操作(cud)加排他锁,查询操作加共享锁,没有客户端快照 来实现的。除了两个事务都是执行的select操作,不阻塞另一事务外。其他交替出现的操作都会阻塞另一事务,知道该事务commit。

8. 如果一个事务A(任何隔离级别下)对某行记录执行了更改操作,这时一个普通操作(非事务)也对该行记录执行更改操作的化,会被阻塞,直到事务A commit.

以上是关于mysql事务特点总结的主要内容,如果未能解决你的问题,请参考以下文章

MySQL-09-笔记

理解MySQL数据库不可缺少的知识(索引,事务存储引擎)!

理解MySQL数据库不可缺少的知识(索引,事务存储引擎)!

MySQL事务与存储引擎

MySQL数据库之——索引事务存储引擎。(快速搜索你想要的内容)

MySQL 索引 与 事务