事务的隔离界别

  事务的ACID特性:

  1、Atomicity原子性  事务操作的不可分割性,要么全部执行,要么回滚。

  2、Consistency一致性  数据库在事务处理前后处于的一致性状态。如银行转账,两个账户转账前的状态和转账后的状态必须一致。

  3、Isolation隔离性 同一时刻执行多个事务,一个事务的执行不能被其他事务干扰。

  4、Durability持久性 持久性指一旦成功执行,在系统中产生的所有变化将是永久的。

  事务的隔离级别是事务并发控制的整体解决方案,是综合利用各种类型的锁机制解决并发问题的整体解决方案

  首先了解一下常见的并发问题:

  1、脏读:一个事务可以读到另一个事务未提交的数据,违背了事务的隔离性原则。

  2、不可重复读:同一个事务内,两条相同的查询语句的查询结果不一致。

  3、幻读:屏蔽了对其他用户修改数据的查询,等到提交时发现出错了。

  这三个并发问题的出现都是在前一问题的基础之上发生的,

  比如,脏读问题可以这样理解,客户A从数据库读取数据行到内存并修改,但是还没有提交,此时客户B也要读取这一行,但是这个读取是在内存中读取的客户A未提交的数据。

      不可重复读是在解决了脏读的情况下,不再读取未提交的数据,而是从数据库中直接读取已经提交的数据,但是这样会在同一事务中产生一个问题,就是两次查询的结果可能不一致,比如第一次查询在客户端提交前,第二次查询在客户端提交后,结果这两次查询结果不一致。

     幻读问题是在解决了不可重复读问题的前提下,即同一事务中重复查询的结果一致,但是这又会产生新的问题,比如第一次查询是否存在某个用户,假设不存在,此时客户B插入这个用户,此时这个事务的隔离界别是可重复读,那么再次查询这个用户肯定还是不存在,但是此时数据库中已经存在了这个用户,客户A再次插入的话必然会产生duplicate错误。

  为了解决这些并发问题,SQL定义了四种隔离级别:

  read uncommitted(读取未提交的数据)    可能存在  以上三种问题

  read commited 读取提交的数据    解决了脏读问题   但是存在不可重复读和幻读

  repeated read 可重复读      解决了脏读和不可重复读,但是存在幻读现象

  serializable 串行化    解决了脏读,不可重复读和幻读现象,但是发生了锁等待现象,降低了事务间的并发访问性能。

时间: 2024-10-26 13:24:48

事务的隔离界别的相关文章

事务的隔离级别 另一种事务开启方式

事务是有隔离级别 read uncommited (读未提交):不做任何隔离,具有脏读,不可重读对,幻读的问题 read committed (读提交):可以防止脏读,不能防止不可重复读和幻读的问题 repeated read(可重复读):可以防止脏读,不可重复读,不能放在幻读(mysql的默认隔离级别) serializable(串行化):数据库运行为串行,以上问题都可以防止,但是性能低 下面的解释都用这个user表 脏读(a,b同时开始事务,a,b再事务,没有哪一个结束,只有两个都进入事务后

数据库事务的隔离级别

数据库事务的隔离级别有4个,由低到高依次为Read uncommitted.Read committed.Repeatable read.Serializable,这四个级别可以逐个解决脏读.不可重复读.幻读这几类问题. √: 可能出现    ×: 不会出现   脏读 不可重复读 幻读 Read uncommitted √ √ √ Read committed × √ √ Repeatable read × × √ Serializable × × × 注意:我们讨论隔离级别的场景,主要是在多个

事务的特性及事务的隔离级别(转)

原文:http://www.cnblogs.com/fjdingsd/p/5273008.html 本篇讲诉数据库中事务的四大特性(ACID),并且将会详细地说明事务的隔离级别. 如果一个数据库声称支持事务的操作,那么该数据库必须要具备以下四个特性: ⑴ 原子性(Atomicity) 原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,这和前面两篇博客介绍事务的功能是一样的概念,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响. ⑵ 一致性(Consi

数据库事务【隔离级别】

为了快速同步数据的需要,我分段执行了两次python脚本,即开启了两个进程同步数据,结果服务器不时报出数据库死锁异常,通过排查代码和数据库日志发现,是由长事务并发引起的.代码中有入账和出账两个方法,里面涉及操作较多,都为其加了事务,抛出异常时可自动回滚,采用数据库(mysql)默认的隔离级别(Repeatable read).提到并发,一般就会想到用同步代码块的方法的处理,但是由于项目是分布式的,共用一个主库,单单在代码加锁是不能保证数据的准确的,那就只能在数据库层面去考虑加锁了.由于数据量暂时

事务的隔离级别及mysql对应操作

/* 本次高并发解决之道 1,更改事务隔离级别为 read uncommitted读未提交 2,查询前设定延迟,延迟时间为随机 50-500 微秒 3,修改数据前将 超范围作为 限定修改条件 事务是作为单个逻辑工作单元执行的一系列操作.可以是一条SQL语句也可以是多条SQL语句.一个支持事务 Transaction的数据库系统,必需要具有这四种特性,以保证保证数据的正确性 事务的隔离级别 隔离级别与并发性是互为矛盾的:隔离程度越高,数据库的并发性越差:隔离程度越低,数据库的并发性越好. 隔离级别

事务的隔离级别和传播行为

一.事务的隔离级别 1.五种事务的隔离级别 ①读_未提交(read_uncommitted): 会出现脏读.不可重复读.幻读.(隔离级别最低,并发性能高) ②读_已提交(read_committed):会出现不可重复读.幻读.(锁定正在读取的行) ③重复读(repeatable_read):会出现幻读.(锁定所读取的所有行) ④序列化(serializable):保证所有的情况不会发生:(锁表) ⑤默认的隔离级别: 大多数的默认隔离级别是:读已提交(read_commited)如:Sql Ser

SQLServer 事务的隔离级别

SQLServer事务的隔离级别 数据库是要被广大客户所共享访问的,那么在数据库操作过程中很可能出现以下几种不确定情况. 更新丢失(Lost update) 两个事务都同时更新一行数据,但是第二个事务却中途失败退出,导致对数据的两个修改都失效了.这是因为系统没有执行任何的锁操作,因此并发事务并没有被隔离开来. 脏读(Dirty Reads) 一个事务开始读取了某行数据,但是另外一个事务已经更新了此数据但没有能够及时提交.这是相当危险的,因为很可能所有的操作都被回滚. 不可重复读(Non-repe

JDBC: 处理事务 & 事务的隔离级别

一.数据库事务 在数据库中,所谓事务是指一组逻辑操作单元,使数据从一种状态变换到另一种状态. 为确保数据库中数据的一致性,数据的操纵应当是离散的成组的逻辑单元:当它全部完成时,数据的一致性可以保持,而当这个单元中的一部分操作失败,整个事务应全部视为错误,所有从起始点以后的操作应全部回退到开始状态. 事务的操作:先定义开始一个事务,然后对数据作修改操作,这时如果提交(COMMIT),这些修改就永久地保存下来,如果回退(ROLLBACK),数据库管理系统将放弃所作的所有修改而回到开始事务时的状态.

数据库事务的四个基本特征以及事务的隔离级别

一.数据库事务的四个基本特征 事务是作为一个逻辑单元执行的一系列操作,一个逻辑工作单元必须有四个属性,称为 ACID(原子性.一致性.隔离性和持久性)属性,只有这样才能成为一个事务. 1.原子性(Atomicity):事务中包含的操作被看做一个逻辑单元,这个 逻辑单元中的操作要么全部成功,要么全部失败. 2.一致性(Consistency):一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态. 拿转账来说,假设用户A和用户B两