-----------------------------------------------------------
  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. 动态绑数据(Repeater控件HeaderTemplate和ItemTemplate)

    前几天,Insus.NET有写了<动态绑数据(GridView控件Header和ItemTemplate)>http://www.cnblogs.com/insus/p/3303192.h ...

  2. Kotlin第一篇 Hello Kotlin以及简单介绍。

    首先需要一个编译器,我们使用Intellij IDE  https://www.jetbrains.com/idea/download/#section=windows 下载下来安装好. 那么我们就来 ...

  3. iOS工程师 - 简历

    基本信息 姓 名:张学友                  性 别:男 年 龄:28                      学 历:本科 毕业学校:广西师范大学       专 业:通信工程 手 ...

  4. 循环队列(Joseplus Problem)

    #include <iostream> #include <stdio.h> using namespace std; ]; ; void Enqueue(int x) { ) ...

  5. 在PowerShell中操作SharePoint对象

    1. 用PowerShell创建一个SharePoint内容对象创建一个自定义列表:$SPSite = New-Object Microsoft.SharePoint.SPSite("htt ...

  6. Java NIO看这一篇就够了

    原文链接:https://mp.weixin.qq.com/s/c9tkrokcDQR375kiwCeV9w? 现在使用NIO的场景越来越多,很多网上的技术框架或多或少的使用NIO技术,譬如Tomca ...

  7. 移动app整合个推进行消息推送

    首先前端代码写好之后进行发行打包: 然后再进行发行打包: 然后登录个推官网: 测试: 点击推送,在手机端就可以获取到信息了. java代码测试: package com.cxy.bean; impor ...

  8. mybatis主键返回语句 使用方法,就是实体类.getid即可拿到返回的id

    <insert id="insertSelective" parameterType="com.o2o.Content" useGeneratedKeys ...

  9. linode出现以下报错

    Linode Manager 报错 系统重新安装后 解决办法执行  rm -rf ~/.ssh/known_hosts 再继续执行:ssh root@72.14.189.163

  10. C语言ctype.h字符函数和字符串

    ctype.h存的是与字符相关的函数: 这些函数虽然不能处理整个字符串,但是可以处理字符串中的字符: ToUpper()函数,利用toupper()函数处理字符串中的每个字符,转换成大写: Punct ...