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
相关推荐
数据库隔离级别扫描.pdf
MySQL数据库隔离级别
数据库隔离级别的选择与实现
数据库隔离级别与脏读、幻读的深入解析
oracle 事务隔离级别 事务不同引发的状况: 脏读(Dirty reads) 一个事务读取另一个事务尚未提交的修改时,产生脏读 很多数据库允许脏读以避免排它锁的竞争。 不可重复读(Nonrepeatable reads) 同一查询在同一事务中...
数据库事务和隔离级别
数据库的隔离级别,数据库的隔离级别,数据库的隔离级别,数据库的隔离级别
近突然发现忘了数据库锁和数据库隔离级别,时常弄混它们之间的关系。为此特此写下此博客,以方便自己复习,同时也可以帮助博友。 数据库锁 数据库锁是事务T在对某个数据对象(例如表、记录等)操作之前,先向...
介绍数据库事务的四种隔离级别,比较不同隔离级别的区别和影响
GBase 8s隔离级别
GBase8s_隔离级别.docx
数据库隔离级别与Spring配置事务的联系及性能影响,以下是个人理解,如果有瑕疵请及时指正
有关JDBC事务 JTA事务 传播特性 隔离级别等等
数据库事务隔离级别.docx数据库事务隔离级别.docx数据库事务隔离级别.docx
查询:默认事务隔离级别 mysql> select @@tx_isolation;当前会话的默认事务隔离级别 mysql> select @@session.tx_isolation;当前会话的默认事务隔离级别 mysql> select @@global.tx_isolation;全局的事务隔离级别
数据库隔离级别是为了解决数据库并发访问过程中产生的各种数据安全问题. 事务的基本要素(ACID) 原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。事务执行过程中出错...
DB2 inforcenter上的隔离级别介绍