数据库隔离级别

ANSI/ISO SQL定义的标准隔离级别有四种,从高到底依次为:可序列化(Serializable)、可重复读(Repeatable reads)、提交读(Read committed)、未提交读(Read uncommitted)。

 

如果处理不好就会产生脏读不可重复读或者幻读等读现象。

 

数据库采用锁的机制才实现这四种隔离级别

以mysql为例,数据库分为表级锁,行级锁,这两种锁又可以细分为表读锁,表写锁,行读锁,行写锁, 简单说就是表锁会锁住整个表,行锁锁住指定的行, 获取读锁的时候其他事务仍然可以获取此读锁,获取写锁之后其他事物只能block知道他释放写锁

 

了解以上之后接下来说明mysql如何利用这些锁来实现隔离级别以避免脏读,不可重复读,幻读

1. 读未提交

    读未提交是因为一个事务读取了到另外一个事务的还没有提交的数据,这在大部分的业务上面都是不允许的,之所以能读取到其他事务还没有commit的数据是因为:

    事务1在读数据的时候没有加任何锁,修改数据的时候也只是加了行级别的读锁

这就导致事务2的事务进行(还没有提交)的过程中可以修改某些事务1已经读取到的数据,因为事务2修改的时候也只是加了读锁,这样事务1再次读取的时候就可以读取到那些修改过的数据,这就是幻读

 

2. 读已提交

    这个和1不同就是,事务1读数据的时候加读锁,读完就释放,更新数据的时候加写锁,事务完成之后再释放,正是因为事务1读完某行数据就释放了锁,然后事务2就可以更新那些数据,所以事务1再次读取的时候数据就不同了,这就是不可重复读

 

3.可重复读

    这个和2不同的就是,事务1读数据的时候加读锁,读完不会释放,等到事务1结束的时候才释放,那么其他事务就不能在这个过程中获得写锁,这样事务1就可以重复读取到一样的数据,但是还是会出现幻读,因为其他事务可以insert数据,这个是行锁不能避免的

 

4.可序列话

   事务在读取数据时,对其加 表级读锁 ,直到事务结束才释放;
   事务在更新数据时,对其加 表级写锁 ,直到事务结束才释放。

这样某一事务在读取数据的过程中,其他事务都不能对相关表进行修改,也就不会发生幻读

 

另外需要理解的是,你更新了数据即便没有commit,数据也是真实的改变了,只不过没有永久的save,这个时候可以rollback,所以才有了未提交读。

 

 

ps:

http://www.hollischuang.com/archives/943
http://www.hollischuang.com/archives/923
http://www.hollischuang.com/archives/914

MySQL 数据库隔离级别主要用于控制事务处理的并发度和一致性,主要分为四个级别: 1. **读未提交(READ UNCOMMITTED)**: 这是最宽松的隔离级别,允许读取到其他事务尚未提交的数据。这可能导致数据一致性问题,如脏读、不可重复读和幻读。 2. **读已提交(READ COMMITTED)**: 只能读取到其他事务已经提交了的数据。避免了脏读,但由于更新操作可能会导致不可重复读和幻读的情况。 3. **可重复读(REPEATABLE READ)**: 保证在同一事务内的查询结果始终一致,即查询结果不会受到其他事务的影响。可以防止脏读和不可重复读,但仍然可能出现幻读情况。 4. **序列化(SERIALIZABLE)**: 此级别提供最高程度的隔离性,所有的事务按照固定的顺序逐一执行,完全避免了脏读、不可重复读和幻读问题,但是它通常会影响性能并限制并发能力。 为了改变 MySQL 数据库的默认隔离级别,在 SQL 查询中使用 `SET` 命令即可: ```sql SET SESSION TRANSACTION ISOLATION LEVEL [READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE]; ``` 例如,将当前会话的隔离级别设置为可重复读: ```sql SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ; ``` 更改隔离级别的影响因素包括但不限于数据库配置文件中的设置(例如通过 `my.cnf` 或者 `my.ini`),以及在需要时手动调整每个会话的隔离级别
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值