MySQL事物(一)事务隔离级别和事物并发冲突

数据库的操作通常为写和读,就是所说的CRUD:增加(Create)、读取(Read)、更新(Update)和删除(Delete)
事务就是一件完整要做的事情
事务是恢复和并发控制的基本单位。
事务必须始终保持系统处于一致的状态,不管在任何给定的时间并发事务有多少。
事务在关系数据库中,一个事务可以是一条SQL语句,一组SQL语句或整个程序。是数据库中各种数据项的一个程序执行单元。
事务是用户定义的一个操作序列(多个表同时读写)。这些操作要么都做,要么都不做,是一个不可分割的工作单位。
事务通常是以BEGIN TRANSACTION开始,以COMMIT或ROLLBACK结束
COMMIT:表示事务完成提交,即提交事务的所有操作,具体地说就是将事务中所有对数据库的更新写回到磁盘上的物理数据库中去,事务正常结束。
ROLLBACK:表示事务的回滚,即在事务运行的过程中发生了某种故障,事务不能继续进行,系统将事务中对数据库的所有以完成的操作全部撤消,滚回到事务开始的状态或设置的回滚点。
事务具有的特性ACID原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)
原子性(Atomicity):事务是数据库的逻辑工作单位,事务中包括的诸操作要么全做【全部成功】,要么全不做【全部失败】。
一致性(Consistency):事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态,一致性与原子性是密切相关的。
隔离性(Isolation):一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
持续性/永久性(Durability):一个事务一旦提交,它对数据库中数据的改变就应该是永久性的,其他操作或故障不应该对其有任何影响。
事物的隔离级别:
SQL的标准定义了4个隔离级别,设定一定的规则,限定事务内部的那些改变是可见的,那些是不可见的。低级别的事务一般会支持更高的并发处理,涉及更低的系统开销。
Read Uncommitted【读未提交数据】:允许所有事务读取未被其他事务提交的数据修改。会导致脏读、不可重复读和幻读的问题的出现。  
Read Committed【读已提交数据】:只允许事务读取已经被其他事务提交的数据修改。oracle和sql server默认的级别,可以避免脏读,但不可重复读和幻读问题仍然会出现。
Repeatable Read【可重读】:是MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。但幻读问题未解除。
Serializable【可串行化】:最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。
隔离级别各个问题:
这四种隔离级别采取不同的锁类型来实现,若读取的是同一个数据的话,就容易发生问题。
脏读【Drity Read】:A和B两个事务,A事务更新一份数据,未提交事物,B事务在此时读取了A的更新的数据,由于某些原因,A事务RollBack回滚了事务操作,则B事务所读取的A更新的数据就会是无效的临时的不正确的数据。
不可重复读【Non-repeatable read】:是指在一个事务内,多次读同一数据。A和B两个事务,A事务读取但A事务还没有结束时,B事务也访问修改了该同一数据并提交了事务。A事务再次读取,则两次读数据之间,由于B事务的修改,那么A事务两次读到的的数据可能是不一样的。这样就发生了在一个事务内两次读到的数据是不一样的,因此称为是不可重复读。
避免“不可重复读”,通常可以用repeatable read 来设置隔离级别,这样事务A两次读取表中的数据时,事务B如果企图更改此表中的数据时,就会被阻塞,直到事务A提交,这样就保证了,事务A两次读取的数据的一致性。
事务A要两次读取表的中数据,虽然可以设置repeatable read防止事务B对数据进行修改,但是事务B却可以向表中插入新的数据,产生幻读。
幻读【Phantom Read】:是指当事务不是独立执“行数据”操作时发生的一种现象,A和B两个事务,A事务对表中的数据进行了修改,此修改涉及到全部的数据行,同时B事务也对此表中的数据进行了修改,此修改向表中插入了新的行。后操作A事物发现表中还有没有被修改的行,好像发生了幻觉一样。

InnoDB和Falcon[已淘汰]存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)机制解决了该问题。
避免“幻读”,设置最高的事务隔离级别serializable,事务B就只能等待事务A的提交,才能想表中插入新的数据,从而避免了幻读。
数据库系统必须具有隔离并发运行各个事务的能力, 使它们不会相互影响, 避免各种并发问题.一个事务与其他事务隔离的程度称为隔离级别. 数据库规定了多种事务隔离级别, 不同隔离级别对应不同的干扰程度, 隔离级别越高, 数据一致性就越好, 但并发性越弱。  
下图为数据库各隔离级别涉及的问题:Yes为存在问题,No反之不存在事务并发冲突问题:


丢失更新1:A和B两个事务,事物A先查询数据为15,后B事物对此数据进行了加5,则数据变为20,提交B事务,后A对此数据进行减5,修改此数据为10,某些原因A事务回滚数据则回到了15。丢失了B的更新。
丢失更新2:A和B两个事务,事物A先查询数据为15,后B事物对数据进行减5,数据修改为10,提交B事务,后A对其进行对数据进行加5,修改数据为20,提交事务A,最终此数据为20。丢失了B的更新。

时间: 2025-01-02 04:08:00

MySQL事物(一)事务隔离级别和事物并发冲突的相关文章

mysql中不同事务隔离级别下数据的显示效果

  事务是一组原子性的SQL查询语句,也可以被看做一个工作单元.如果数据库引擎能够成功地对数据库应用所有的查询语句,它就会执行所有查询,如果任何一条查询语句因为崩溃或其他原因而无法执行,那么所有的语句就都不会执行.也就是说,事务内的语句要么全部执行,要么一句也不执行. 事务的特性:acid,也称为事务的四个测试(原子性,一致性,隔离性,持久性) automicity:原子性,事务所引起的数据库操作,要么都完成,要么都不执行 consisitency:一致性,事务执行前的总和和事务执行后的总和是不

MySQL 四种事务隔离级别详解及对比_Mysql

MySQL 四种事务隔离级别详解及对比 按照SQL:1992 事务隔离级别,InnoDB默认是可重复读的(REPEATABLE READ).MySQL/InnoDB 提供SQL标准所描述的所有四个事务隔离级别.你可以在命令行用--transaction-isolation选项,或在选项文件里,为所有连接设置默认隔离级别. 例如,你可以在my.inf文件的[mysqld]节里类似如下设置该选项: transaction-isolation = {READ-UNCOMMITTED | READ-CO

浅谈MySQL中的事务隔离级别(r11笔记第86天)

   之前写了一篇浅谈事务(一),算是对事务的一个基本认识,今天来简单总结一下事务的隔离级别,虽然是老掉牙的知识点,重温一下还是值得的.    在MySQL中基本有这两种事务隔离级别的设置,默认的RR(Repeatable-Read)和实际中常见的RC(Read-Committed).两者区别是什么,怎么正确理解,用几个SQL语句就能说明白,就用简单的实验来说明白.    我们开始吧.        首先创建一个测试表test,插入一些数据. create table test( id int

MySQL中Innodb的事务隔离级别和锁的关系的讲解教程_Mysql

前言: 我们都知道事务的几种性质,数据库为了维护这些性质,尤其是一致性和隔离性,一般使用加锁这种方式.同时数据库又是个高并发的应用,同一时间会有大量的并发访问,如果加锁过度,会极大的降低并发处理能力.所以对于加锁的处理,可以说就是数据库对于事务处理的精髓所在.这里通过分析MySQL中InnoDB引擎的加锁机制,来抛砖引玉,让读者更好的理解,在事务处理中数据库到底做了什么. 一次封锁or两段锁?因为有大量的并发访问,为了预防死锁,一般应用中推荐使用一次封锁法,就是在方法的开始阶段,已经预先知道会用

MySQL事务隔离级别介绍及设置

READ UNCOMMITTED(未提交) 即使没有提交,对其它事务也可见.未提交的数据会引起脏读(Dirty Read). 测试流程: 1.A设置read-uncommitted, start transaction 2.B执行start transaction,修改一条记录, 3.A查询记录,得到了以为正确的记录 4.B回滚. 问题:A读到了B没有提交的记录,也就是脏读. READ COMMITTED(提交读) 一个从开始直到提交之前所做的任何修改对其它事务都是不可见的.两次同样的查询可能会

[用事实说明两个凡是]一个由mysql事务隔离级别造成的问题分析

背景 最近要做一个批跑服务, 基本逻辑就是定时扫描数据库的记录, 有满足条件的就进行处理(一条记录代表一个任务,以下任务与记录含义相同). 要求支持多机部署批跑服务. 批跑支持多机部署实现方案 要实现多机部署, 只要保证每个批跑服务实例每次只获取一条记录, 处理完再获取下一条即可. 其中最种要的是避免不同的实例获取到同一条记录,即所谓抢任务. 先看表结构设计: create database if not exists ae; create table ae.task ( id int prim

【mysql】官方的SQL事务隔离级别文档

SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的.低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销. Read Uncommitted(读取未提交内容) 在该隔离级别,所有事务都可以看到其他未提交事务的执行结果.本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少.读取未提交的数据,也被称之为脏读(Dirty Read). Read Committed(读取提交内容) 这是大多数数据库系统的默认隔离级别(但不是MySQL默认的

【MySQL】MySQL的四种事务隔离级别

[MySQL]MySQL的四种事务隔离级别 本文实验的测试环境:Windows 10+cmd+MySQL5.6.36+InnoDB 一.事务的基本要素(ACID) 1.原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节.事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有发生一样.也就是说事务是一个不可分割的整体,就像化学中学过的原子,是物质构成的基本单位.  2.一致性(Consistency):事务开始前和结束后,数据库的完整性约束

MySQL事务隔离级别详解(转)

原文: http://xm-king.iteye.com/blog/770721 SQL标准对事务定义了4种隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的.低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销.实际中,最常用的级别为Read Committed(读取提交内容).Read Uncommitted(读取未提交内容) 在该隔离级别,所有事务都可以看到其他未提交事务的执行结果.本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少.读取未提交