-----------------------------------------------------------
  ACID指数据库事务正确执行的四个基本要素:原子性(Atomicity),一致性(Consistency),隔离性(Isolation),持久性(Durability)。
  1、原子性
  原子性是指事务是一个不可再分割的工作单位,事务中的操作要么都发生,要么都不发生。
  a.案例A给B转账100元钱

begin transaction
update account set money= money - 100where name='A';
update account set money= money +100where name='B';
if Error then
rollback
else
commit
  b.分析
  在事务中的扣款和加款两条语句,要么都执行,要么就都不执行。否则如果只执行了扣款语句,就提交了,此时如果突然断电,A账号已经发生了扣款,B账号却没收到加款,在生活中就会引起纠纷。
  c.解决方法
       在数据库管理系统(DBMS)中,默认情况下一条SQL就是一个单独事务,事务是自动提交的。只有显式的使用start transaction开启一个事务,才能将一个代码块放在事务中执行。保障事务的原子性是数据库管理系统的责任,为此许多数据源采用日志机制。
  为了实现原子性,db将所有对数据的更新操作都写入日志,如果一个事务中一个部分操作已经成功,但以后的操作由于断电\系统崩溃等原有而无法继续,则通过回溯日志,将已经执行成功的进行撤销,从而达到“全部操作失败”的效果。最常见的场景是数据库系统崩溃后重启,此时数据库处于不一致的状态,需要先执行一个crash recover过程:读取日志进行redo,再对所有到崩溃时未提交的事务进行undo。
  2、一致性
  一致性是指在事务开启之前和事务结束之后,数据库的完整性约束没有被破坏。这个说的太抽象了,感觉一直没有理解透彻。
  我的理解:一致性就是指数据处于一种正确的有现实意义的状态,这种状态是语义上的而不是语法上的。例如:A转账到B账户上,如果A账户减少了而B没有增加,则我们认为此事数据处于不一致的状态。
  单纯的原子性并不能保证一致性,多事务并行的情况下,即使保证每一个事务的原子性,仍然不能保证数据的一致性。例如:事务1将100元转入A账户,它先读取A账户的余额,然后在此基础上加100,然后更新A的余额;这个过程中事务2修改了A的值,为他增加了100元,最终结果应该是A增加了200,但事实上可能是100,因为事务1把事务2的结果给覆盖了。
  3、隔离性
  正是因为2中覆盖的原因,才有了隔离性。多个事务并发访问的时候,事务之间应该是隔离的,一个事务不应该影响到其它事务的运行效果。
  为了实现这一点,我们创造了各种锁机制。所有的锁,无非两种类型,悲观或乐观。
  悲观锁:将当前事务所涉及的所有对象加锁,操作完成后再是否给它人使用。为了尽可能提高性能,发明了各种粒度的锁(数据库级/表级/行级),各种性质的锁(共享锁,排他锁,共享意向锁,排他意向锁,,,)。为了解决死锁问题,又发明了两阶段锁协议/死锁检测等一系列技术。
  乐观锁:不同的事务可以同时看到同一对象(一般是数据行)的不同历史版本,如果两个事务同时修改了同一行数据,那么较晚的事务提交时进行冲突检测。
  锁也是数据库实现中最复杂的部分之一,如果涉及到分布式系统,会更加复杂的多。
  实际生产中,完全的事务隔离是不现实的,因为这会导致同一时间只执行一条事务,严重影响性能。
  几个概念:
  a、脏读
  一个事务读取了另一个事务未提交的数据,而这个数据是有可能回滚的;
  b、不可重复度
  不可重复读意味着,在数据库访问中,一个事务范围内两个相同的查询却返回了不同数据。这是由于查询时系统中其他事务修改的提交而引起的。如下案例,事务1必然会变得糊涂,不知道发生了什么。

 
  c、幻读
   幻读,是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样。(跟情况b类似)
  d、丢失更新
       两个事务同时读取同一条记录,A先修改记录,B也修改记录(B是不知道A修改过),B提交数据后B的修改结果覆盖了A的修改结果。
  mysql的四种事务隔离级别:

 
  默认隔离级别是 读已提交(Read committed)
  4、持久性
  持久性,意味着在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。即使出现了任何事故比如断电等,事务一旦提交,则持久化保存在数据库中。
 

 

数据库的ACID跟事务隔离级别的更多相关文章

  1. Spring支持的常用数据库传播属性和事务隔离级别

    一.事务的传播属性 1.propagation:用来设置事务的传播行为,一个方法运行在了一个开启了事务的方法中时,当前方法是使用原来的事务还是开启一个新的事务. (1)propagation.REQU ...

  2. 数据库事务隔离级ORACLE数据库事务隔离级别介绍

    本文系转载,原文地址:http://singo107.iteye.com/blog/1175084 数据库事务的隔离级别有4个,由低到高依次为Read uncommitted.Read committ ...

  3. JDBC之事务隔离级别以及ACID特性

    JDBC之事务隔离级别以及ACID特性 事务隔离级别: 1.更新遗失(Lost update) 两个事务都同时更新一行数据,但是第二个事务却中途失败退出,导致对数据的两个修改都失效了.这是因为系统没有 ...

  4. 数据库常用的事务隔离级别和原理?&&mysql-Innodb事务隔离级别-repeatable read详解

    转载地址:https://baijiahao.baidu.com/s?id=1611918898724887602&wfr=spider&for=pc https://blog.csd ...

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

    数据库的操作通常为写和读,就是所说的CRUD:增加(Create).读取(Read).更新(Update)和删除(Delete).事务就是一件完整要做的事情.事务是恢复和并发控制的基本单位.事务必须始 ...

  6. 五分钟搞清楚MySQL事务隔离级别

    好久没碰数据库了,只是想起自己当时在搞数据库的时候在事务隔离级别这块老是卡,似懂非懂的.现在想把这块整理出来,尽量用最简洁的语言描述出来,供新人参考. 首先创建一个表account.创建表的过程略过( ...

  7. mysql-Innodb事务隔离级别-repeatable read详解(转)

    一.事务隔离级别 ANSI/ISO SQL标准定义了4中事务隔离级别:未提交读(read uncommitted),提交读(read committed),重复读(repeatable read),串 ...

  8. mysql-Innodb事务隔离级别-repeatable read详解1

    经验总结: Python使用MySQLdb数据库后,如使用多线程,每个线程创建一个db链接,然后再各自创建一个游标cursor,其中第一个线程读一个表中数据为空,第二个写入该表一条数据并提交,第一个线 ...

  9. mysql-Innodb事务隔离级别-repeatable read详解

    http://blog.csdn.net/dong976209075/article/details/8802778 经验总结: Python使用MySQLdb数据库后,如使用多线程,每个线程创建一个 ...

随机推荐

  1. redis系列:哨兵

    1 简介 Sentinel(哨兵)是Redis 的高可用性解决方案:通过哨兵可以创建一个当主服务器出现故障时自动将从服务器升级为主服务器的一个分布式系统.解决了主从复制出现故障时需要人为干预的问题. ...

  2. [raspberry pi3] 串口线使用

    直接上图 GPIO 口说明: 串口线连接: 参考地址: http://bbs.elecfans.com/jishu_596578_1_1.html

  3. 调试.NET CORE代码

    前言 core也用了很长一段时间了,发现很多小伙伴不知道如何调试core的代码. 可想而知,以前使用mvc的时候,不需要发布代码,直接iis地址指向项目源码,然后附加到进程w3wp.exe就可以调试了 ...

  4. SqlServer学习笔记【暂】

    Sql学习笔记,暂时先保存在着,等不忙了再整理成章节,如果其中有问题的,还请各位大神不吝赐教! --------------------------------------所有的数据基于Northwi ...

  5. metasploit 学习笔记-VULNERABILITY SCANNING

    使用漏洞扫描器会在网络上产生大量流量,因此如果你不希望被发现踪迹时,不要使用漏洞扫描器。 The Basic Vulnerability Scan 漏洞扫描器的质量很大程度上取决于它自带的漏洞特征库。 ...

  6. NSPoint 位置

    前言 结构体,这个结构体用来表示事物的一个坐标点. typedef CGPoint NSPoint; struct CGPoint { CGFloat x; CGFloat y; }; typedef ...

  7. pychram编写代码鼠标变粗处理

    现象:如下图 解决: 键盘 点击 insert 按钮即可解决

  8. 转载JAVA八大经典书籍,你看过几本?

    一.Java从入门到精通*<Java从入门到精通(第3版)>从初学者角度出发,通过通俗易懂的语言.丰富多彩的实例,详细介绍了使用Java语言进行程序开发需要掌握的知识.<Java从入 ...

  9. 树链剖分【洛谷P2590】 [ZJOI2008]树的统计

    P2590 [ZJOI2008]树的统计 题目描述 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w. 我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t : 把 ...

  10. luogu2723 丑数

    提供一种单调队列做法(非正解) 显然每一个丑数能够由一个质数乘以另一个丑数得到 所以我们开k个单调递增队列,每次从这些队列顶部找到一个最小的元素把他捞出来,然后枚举所有质数,用这个元素乘以质数,放入相 ...