事务隔离级别

本文详细介绍了数据库事务并发执行时可能出现的脏读、不可重复读和幻读问题,并阐述了通过设置事务隔离级别(Read uncommitted、Read committed、Repeatable read、Serializable)来解决这些问题。MySQL默认隔离级别为Repeatable read,而Oracle为Read committed。隔离级别越高,数据完整性和一致性越好,但并发性能可能下降。
摘要由CSDN通过智能技术生成

问题:

同一个应用程序中的多个事务或不同应用程序中的多个事务在同一个数据集上并发执行时, 可能会出现许多意外的问题,这些问题可分为如下三种类型:

脏读(Drity Read): 已知有两个事务AB, A读取了已经被B更新但还没有被提交的数据,之后,B回滚事务,A读取的数据就是脏数据。

不可重复读(Non-repeatable read):已知有两个事务ABA 多次读取同一数据,B A多次读取的过程中对数据作了修改并提交,导致A多次读取同一数据时,结果不一致,例子: 

幻读(Phantom Read): 已知有两个事务ABA从一个表中读取了数据,然后B在该表中插入了一些新数据,导致A再次读取同一个表, 就会多出几行,简单地说,一个事务中先后读取一个范围的记录,但每次读取的纪录数不同,称之为幻象读,例子: 

简单来说,脏读是一个事务查询了另一个事务未提交的数据,而提交后数据和其第一次查询可能是不一样的;不可重复读就是在数据被另一个事务还可以更改时,被另一个事务查询,导致更改前后查询结果不一致;幻读是事务中多出或者少了数据,改变的先后被另一个事务读取,造成其读取到的记录数量不一样。因此,解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表

解决方案

根据实际需求,通过设置数据库的事务隔离级别可以解决多个事务并发情况下出现的脏读、不可重复读和幻读问题,数据库事务隔离级别由低到高依次为Read uncommittedRead committedRepeatable readSerializable等四种。数据库不同,其支持的事务隔离级别亦不相同:MySQL数据库支持上面四种事务隔离级别,默认为Repeatable readOracle 数据库支持Read committedSerializable两种事务隔离级别,默认为Read committed

1Read uncommitted(读未提交):可能出现脏读、不可重复读和幻读。

2Read committed(读提交):可以避免脏读,但可能出现不可重复读和幻读。大多数数据库默认级别就是Read committed,比如Sql Server数据库和Oracle数据库。注意:该隔离级别在写数据时只会锁住相应的行。

3Repeatable read(重复读):可以避免脏读和不可重复读,但可能出现幻读。注意:①、事务隔离级别为可重复读时,如果检索条件有索引(包括主键索引)的时候,默认加锁方式是next-key 锁;②、如果检索条件没有索引,更新数据时会锁住整张表。一个间隙被事务加了锁,其他事务是不能在这个间隙插入记录的,这样可以防止幻读。

4Serializable(序列化):可以避免脏读、不可重复读和幻读,但是并发性极低,一般很少使用。注意:该隔离级别在读写数据时会锁住整张表。

说明:√表示可能出现,×表示不会出现

注意:隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大。

MySQL事务隔离级别

       查看MySQL数据库支持Read uncommittedRead committedRepeatable readSerializable四种事务隔离级别,默认为Repeatable read,可以通过如下语句查看MySQL数据库事务隔离级别:

                                                 select @@global.tx_isolation,@@tx_isolation;

修改MySQL数据库事务隔离级别的修改分为全局修改和当前session修改,具体修改方法如下:                                                                                                                                       

1、全局修改

①、在my.ini配置文件最后加上如下配置:

 、重启MySQL服务

2、当前session修改,登录MySQL数据库后执行如下命令:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值