什么是数据库事务隔离级别?
数据库事务隔离级别有哪些?
数据库事务隔离级别有什么用和脏读、幻读、不可重复读有啥联系?
1. 数据库隔离级别定义
数据库事务隔离级别主要作用是实现事务工作期间,数据库操作读的隔离特性。在MySQL中,数据是以页为单位进行存储的(这里不展开讲了),所谓读的操作就是将数据页内数据加载(load)至内存的过程,数据库的隔离特性也就决定了读取数据页中相应数据行的能力的优先级,并且不同事务之间的数据页读操作相互隔离,可以简单理解为:一个事务在对数据页中数据行做更新操作时,在没有更新提交前,另一个事务此时是不能读取数据页中数据行内容的。
2. 如何查看数据库事务使用的隔离级别
对于数据库存储事务隔离级别可以通过操作命令查看获取当前数据库使用的隔离级别:
select @@transaction_isolation;
Navicat:
MySQL客户端:
3. 在讲隔离级别之前,我们先说说关于数据“三读”问题的
1. 脏读(Dirty Read)
脏读指的是一个事务读取了另一个事务尚未提交的数据。
举个例子,假设张三去银行查看自己的账户余额(事务A:查询余额),在事务A未开始之前,李四给他转了200块(事务B:汇款),事务B未提交之前,事务A执行了,张三读取到了李四转来的钱款后的数据,然而李四发现转错了应该转100后,随手回滚了他的事务B,那么张三所读取到的数据实际上无效的。这种事务A读取到了事务B未提交数据的现象即为脏读。
2. 幻读(Phantom Read)
幻读是指当两次相同的查询在事务期间执行时,第二次查询返回了一些新插入的行。
举个例子,假设张三卡里有10块钱,李四尚未开户。张三要去银行查询一下那些人比自己更富有(事务A:因为张三心很细,查询一次不放心,又查询一次,两次查询同属事务A);在事务A执行第一次查询后发现有10个人人比自己富有,未执行第二次查询前,李四开户存储自己刚刚发的100块钱工资(事务B),然后提交事务B,此时李四是比张三富有的;继而事务A张三再查询谁比自己更富有时发现此时多了一个张三,这种一个事务内读取到的结果条数不一致的现象称为幻读。
3. 不可重复读(Non-repeatable Read)
不可重复读指的是一个事务在相同的查询中多次读取同一行数据时,得到了不同的结果。这是因为在两次读取之间,有另一个事务对该行数据进行了修改或删除操作。
举个例子,假设张三要去银行查询余额(事务A:因为张三心很细,查询一次不放心,又查询一次,两次查询同属事务A);在事务A执行第一次查询后,未执行第二次查询前,李四给张三转了100块钱,然后提交事务B;此时事务A再查询自己的账户余额发现数据不一致,这种一个事务内读取数据不一致的现象成为不可重复读。
细心的网友发现了,幻读和不可重复读很相似的,都是一个事务内两次读取,查询到另一个事务的提交后的结果,导致两次查询结果不一致,影响数据条数不一致的即为幻读,影响行内数据发生变化导致的不一致则为不可重复读。
4. 那这些问题怎么解决呢?这就是隔离级别的意义了
4.1 级别1:Read-Uncommitted 读未提交
可以读取其他事务未提交的数据,最低级别的隔离,允许脏读、幻读和不可重复读。事务可以读取其他事务未提交的数据,会导致数据的不一致性。
4.2 级别2:Read-Committed 读已提交
只能可以读取到事务已提交的数据,隔离性一般,解决了脏读问题,但是仍然会出现不可重复读、幻读问题;
4.3 级别3:Repeatable-Read 可重复读(默认的数据库隔离级别)
事务能够多次读取同一数据,并保证在同一事务期间读取到的数据一致。这解决了幻读和不可重复读的问题。数据库使用锁机制来阻止其他事务对数据进行修改,但是并发能力较差会使用next lock锁进制,来防止幻读问题,但是引入锁进制后,锁的代价会比较高,比较耗费CPU资源,占用系统性能;
4.4 级别4:Serializable 可串行化
最高级别的隔离,在每条读的数据上,加上锁,使之不可能相互冲突确保事务串行执行,完全消除了脏读、幻读和不可重复读的问题。但将毫无并发性能可言。
5. 除了隔离级别,还可以使用其他的并发控制机制来解决并发问题,如行级锁和多版本并发控制。
- 行级锁:在对数据进行读写时,对相应的行进行锁定,以阻止其他事务对该行的并发操作。行级锁能够提供更细粒度的控制,但也会增加锁的开销。
- 多版本并发控制(MVCC):为每个事务维护多个版本的数据,在事务执行期间,每个事务读取的是特定版本的数据,从而避免脏读、幻读和不可重复读的问题。MVCC能够提供较好的并发性能,但会增加存储空间的消耗。
附:为了解决脏读、幻读和不可重复读的问题,我们可以通过选择合适的隔离级别、使用行级锁或多版本并发控制等方式来确保事务并发执行时的数据一致性。根据具体的应用场景和性能需求,选择适当的并发控制策略能够提供最佳的解决方案。