数据库的操作通常为写和读,就是所说的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的更新。

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

  1. 事务,Oracle,MySQL及Spring事务隔离级别

    一.什么是事务: 事务逻辑上的一组操作,组成这组操作的各个逻辑单元,要么一起成功,要么一起失败. 二.事务特性(4种): 原子性 (atomicity):强调事务的不可分割:一致性 (consiste ...

  2. MySql锁和事务隔离级别

    在讲mysql事物隔离级别之前,我们先简单说说mysql的锁和事务. 一:数据库锁 因为数据库要解决并发控制问题.在同一时刻,可能会有多个客户端对同一张表进行操作,比如有的在读取该行数据,其他的尝试去 ...

  3. mysql中不同事务隔离级别下数据的显示效果--转载

    事务是一组原子性的SQL查询语句,也可以被看做一个工作单元.如果数据库引擎能够成功地对数据库应用所有的查询语句,它就会执行所有查询,如果任何一条查询语句因为崩溃或其他原因而无法执行,那么所有的语句就都 ...

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

    事务的概念 事 务是一组原子性的SQL查询语句,也可以被看做一个工作单元.如果数据库引擎能够成功地对数据库应用所有的查询语句,它就会执行所有查询,如果任何一条查 询语句因为崩溃或其他原因而无法执行,那 ...

  5. 谈谈MySQL支持的事务隔离级别,以及悲观锁和乐观锁的原理和应用场景?

    在日常开发中,尤其是业务开发,少不了利用 Java 对数据库进行基本的增删改查等数据操作,这也是 Java 工程师的必备技能之一.做好数据操作,不仅仅需要对 Java 语言相关框架的掌握,更需要对各种 ...

  6. MySQL四种事务隔离级别详解

    本文实验的测试环境:Windows 10+cmd+MySQL5.6.36+InnoDB 一.事务的基本要素(ACID) 1.原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做 ...

  7. 在MySQL中设置事务隔离级别有2种方法:

    在MySQL中设置事务隔离级别有2种方法: 1 在my.cnf中设置,在mysqld选项中如下设置 [mysqld] transaction-isolation = READ-COMMITTED 2 ...

  8. 面试必问的MySQL锁与事务隔离级别

    之前多篇文章从mysql的底层结构分析.sql语句的分析器以及sql从优化底层分析, 还有工作中常用的sql优化小知识点.面试各大互联网公司必问的mysql锁和事务隔离级别,这篇文章给你打神助攻,一飞 ...

  9. 第36讲 谈谈MySQL支持的事务隔离级别,以及悲观锁和乐观锁的原理和应用场景

    在日常开发中,尤其是业务开发,少不了利用 Java 对数据库进行基本的增删改查等数据操作,这也是 Java 工程师的必备技能之一.做好数据操作,不仅仅需要对 Java 语言相关框架的掌握,更需要对各种 ...

随机推荐

  1. Angular service定义服务

    <!DOCTYPE html><html ng-app="myApp"><head lang="en"> <meta ...

  2. ubuntu更改分辨率

    1. 输入:$cvt 1920 1080 2 输入: $xrandr 3 输入: $sudo xrandr --newmode "1920x1080_60.00" 173.00 1 ...

  3. python中常用的九种数据预处理方法分享

    Spyder   Ctrl + 4/5: 块注释/块反注释 本文总结的是我们大家在python中常见的数据预处理方法,以下通过sklearn的preprocessing模块来介绍; 1. 标准化(St ...

  4. python之Counter类:计算序列中出现次数最多的元素

    Counter类:计算序列中出现次数最多的元素 from collections import Counter c = Counter('abcdefaddffccef') print('完整的Cou ...

  5. React 组件库框架搭建

    前言 公司业务积累了一定程度,需要搭建自己的组件库,有了组件库,整个团队开发效率会提高恨多. 做组件库需要提供开发调试环境,和组件文档的展示,调研了几个比较主流的方案,如下: docz 配置简单,功能 ...

  6. LightOJ - 1074 Extended Traffic(标记负环)

    题意:有n个城市,每一个城市有一个拥挤度ai,从一个城市u到另一个城市v的时间为:(au-av)^3,存在负环.问从第一个城市到达第k个城市所话的时间,如果不能到达,或者时间小于3输出?否则输出所花的 ...

  7. git push -f

    有的时候使用GIT工作时,会遇到一下这种问题, Pushing to git@github.com:519ebayproject/519ebayproject.git To git@github.co ...

  8. JavaScript 隐式类型转换

    JavaScript 隐式类型转换 原文:https://blog.csdn.net/itcast_cn/article/details/82887895 · 1.1 隐式转换介绍 · 1.2 隐式转 ...

  9. 自学Aruba7.4-Aruba安全认证-MAC认证(web页面配置)

    点击返回:自学Aruba之路 自学Aruba7.4-Aruba安全认证-MAC认证(web页面配置) 由于前三节已经讲述了3种如何web页面配置安全认证,MAC认证就不过多讲解重复的步骤. 步骤1  ...

  10. NOIP2018退役记

    退役失败*1. md可能只有一次啊.