-----------------------------------------------------------
  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. Java50道经典习题-程序27 求素数

    题目:求100之内的素数分析:素数即除了1和它本身以外不再有其他因数,最小的素数是2 判断一个数n是否是素数的方法:将n分别与2到(n+1)/2取余,若有一个值为0,则n就不为素数,反之为素数 pub ...

  2. Web性能权威指南 PDF扫描版​

    Web性能权威指南是谷歌公司高性能团队核心成员的权威之作,堪称实战经验与规范解读完美结合的产物.<Web性能权威指南>目标是涵盖Web开发者技术体系中应该掌握的所有网络及性能优化知识.全书 ...

  3. jQuery 插件开发——countdown(倒计时)

    故事背景:按照惯例,先写下故事背景,其实也是再次汇报下最近开发情况的.做电商的都知道,这是个活动季啊,双十一.双十二.元旦....各种啊..其实说这么多就是想表达最近比较忙.呵呵^_^,正好今天抽点空 ...

  4. officeaddin开发->excel,word另存为html,xml,csv,txt设置编码格式

    在excel中设置保存之后的编码格式,需要获取到Microsoft.Office.Interop.Excel.Workbook然后设置其中的webOpetions的编码格式就可以了. workbook ...

  5. Angular2使用ng2-file-upload上传文件

    Angular2中有两个比较好用的上传文件的第三方库,一个是ng2-file-upload,一个是ng2-uploader.ng2-uploader是一个轻便的上传文件的支持库,功能较弱,而ng2-f ...

  6. RxJS的基础

    RxJS是一个强大的Reactive编程库,提供了强大的数据流组合与控制能力,但是其学习门槛一直很高,本次分享期望从一些特别的角度解读它在业务中的使用,而不是从API角度去讲解. RxJS简介 通常, ...

  7. Java框架之单元测试

    单元测试dao层 @Test   //1.要写 test public void TestUserDao(){ ApplicationContext ctx=new ClassPathXmlAppli ...

  8. js中 关于DOM的事件操作

    一.JavaScript的组成 JavaScript基础分为三个部分: ECMAScript:JavaScript的语法标准.包括变量.表达式.运算符.函数.if语句.for语句等. DOM:文档对象 ...

  9. Python循环加强版——列表生成式

    记得我们在其他语言中都学到过循环,尤其是对for循环是再熟悉不过了 比如我有一个数组  a[10]={1,2,3,4,5,6,7,8,9,10} 下面需要依次循环打印出来,C语言首先想到的是 for( ...

  10. 「NOI.AC」Leaves 线段树合并

    题目描述 现在有一棵二叉树,所有非叶子节点都有两个孩子.在每个叶子节点上有一个权值(有\(n\)个叶子节点,满足这些权值为\(1\dots n\)的一个排列).可以任意交换每个非叶子节点的左右孩子. ...