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
相关推荐
Oracle 数据库隔离级别是数据库事务处理中的核心概念,它决定了事务在并发环境下如何访问和处理数据,以确保数据的一致性和完整性。隔离级别主要解决的是并发操作中的脏读、不可重复读和幻读问题。 脏读(Dirty ...
数据库隔离级别是数据库管理系统中用于控制事务之间交互作用的一个关键特性,它旨在解决并发操作中可能出现的数据不一致性和并发问题。在数据库系统中,主要有四种隔离级别,分别是Read Uncommitted、Read Committed...
MySQL数据库隔离级别
数据库隔离级别的选择与实现
数据库隔离级别与脏读、幻读的深入解析
事务隔离级别 课程目标 了解 —— 事务隔离级别的概念; 理解 —— 事务隔离的四种级别; 掌握 —— 事务隔离级别的设置; 事务隔离级别 事务隔离:每一个事务都有一个所谓的隔离级,它定义了用户彼此之间隔离和交互...
总的来说,数据库隔离级别的选择是一个权衡过程,需要在数据一致性、并发性和性能之间找到合适的平衡点。在设计数据库系统和应用程序时,理解这些隔离级别及其可能产生的效果至关重要,以便做出最佳决策。
数据库事务和隔离级别
近突然发现忘了数据库锁和数据库隔离级别,时常弄混它们之间的关系。为此特此写下此博客,以方便自己复习,同时也可以帮助博友。 数据库锁 数据库锁是事务T在对某个数据对象(例如表、记录等)操作之前,先向...
数据库隔离级别是数据库管理系统在并发环境下确保事务一致性和数据完整性的关键设置。Spring框架与MySQL数据库结合使用时,可以通过配置事务管理器来控制事务的隔离级别,以达到优化性能和保证数据一致性。以下是对...
GBase 8s 是一款高性能的关系型数据库管理系统,它提供了多种隔离级别来处理并发事务,以确保数据的一致性和完整性。隔离级别是数据库系统解决并发控制的重要机制,它定义了事务在执行过程中如何与其他事务交互,...
介绍数据库事务的四种隔离级别,比较不同隔离级别的区别和影响
GBase8s_隔离级别.docx
数据库系统提供了不同的隔离级别来控制这种影响: - **未提交读(Read Uncommitted)**:最低的隔离级别,允许读取未提交的数据,可能导致脏读、不可重复读和幻读。 - **提交读(Read Committed)**:在提交后才...
查询:默认事务隔离级别 mysql> select @@tx_isolation;当前会话的默认事务隔离级别 mysql> select @@session.tx_isolation;当前会话的默认事务隔离级别 mysql> select @@global.tx_isolation;全局的事务隔离级别