-----------------------------------------------------------
  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. python 趣味强制请吃饭

    # -*- coding: utf-8 -*- import easygui who = easygui.buttonbox("你想请谁吃饭 ?", "luckly qu ...

  2. Leafletjs学习教程和相关代码整理

    一.Leaflet简介 官方网站:http://leafletjs.com/ 官网上的api和例子大家多看看,多学习学习. Lefalet 是一个为建设移动设备友好的互动地图,而开发的现代的.开源的 ...

  3. C#多线程 线程嵌套调用问题

    线程嵌套指的是:线程A的执行代码启动了线程B,线程B的执行代码又启动了线程C. 我原本以为线程A被Abort后,线程B会自动被Abort,但是我大错特错了. 在这种场景下,线程的管理就非常重要了. 线 ...

  4. C++: STL迭代器及迭代器失效问题

    转载至:http://blog.csdn.net/wangshihui512/article/details/9791517 迭代器失效: 典型的迭代器失效. 首先对于vector而言,添加和删除操作 ...

  5. 分区表分区字段的update操作

    默认情况下,oracle的分区表对于分区字段是不允许进行update操作的,如果有对分区字段行进update,就会报错——ORA-14402: 更新分区关键字列将导致分区的更改.但是可以通过打开表的r ...

  6. day01.1-计算机体系与数据描述

    一.   指令执行过程                                 二.   计算机体系架构                                其中,ROM所存数据较为 ...

  7. MPI编程指南

    MPI编程指南 一.     MPI概述 1.1  MPI的发展史 MPI标准化涉及到大约60个国家的人们,他们主要来自于美国和欧洲的40个组织,这包括并行计算机的多数主要生产商,还有来自大学.政府实 ...

  8. SOA架构之限流

    参考: 服务限流 1. 限流的作用 限流主要的作用是保护服务节点或者集群后面的数据节点,防止瞬时流量过大使服务和数据崩溃(如前端缓存大量实效),造成不可用:还可用于平滑请求. 2. 限流算法 限流算法 ...

  9. (multi)set的某些操作

    (multi)set的某些操作 我们可以把multiset当作平衡树用~ 注意,必须定义小于运算符. s.begin() 返回指向第一个元素的迭代器. s.end() 返回指向最后元素的后面那个虚拟元 ...

  10. 关于javascript数据存储机制的一个案例。

    之前在学习js的结合性的时候,我有点不太明白,在网上找到一个比较经典的C语言优先级结合性的案例,就是下边这一个.本想在js之中测试一番,结果竟然发现得出的结果和网上的不一样,这令我百思不得其解,后经高 ...