本篇讲诉数据库中事务的四大特性(ACID),并且将会详细地说明事务的隔离级别。

如果一个数据库声称支持事务的操作,那么该数据库必须要具备以下四个特性:

⑴ 原子性(Atomicity)

  原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,所以事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。为了实现原子性,需要通过日志:将所有对数据的更新操作都写入日志,如果一个事务中的一部分操作已经成功,但以后的操作,由于断电/系统崩溃/其它的软硬件错误而无法继续,则通过回溯日志,将已经执行成功的操作撤销,从而达到“全部操作失败”的目的。

⑵ 一致性(Consistency)

  一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态,不允许出现中间状态。

  举例:

拿转账来说,假设用户A有1000块钱,用户B有2000块钱,那么不管A和B之间如何转账,转几次账,事务结束后两个用户的钱相加起来应该还得是3000,这就是事务的一致性。

事务不一致的情况:(1)用户A给用户B转500块钱,此时用户A账户减去500元,剩下500元,但是此时突然系统崩溃了,用户B没来得及加500,此时的数据库就出现了不一致的状态。

          (2)事务1需要将100元转入帐号A:先读取帐号A的值,然后在这个值上加上500。但是,在这两个操作之间,另一个事务2修改了帐号A的值,为它增加了500元。那么最后的结果应该是A增加了1000元。但事实上,事务1最终完成后,帐号A只增加了500元,因为事务2的修改结果被事务1覆盖掉了。这使得三个账户转账后,数据的不一致。

其实,原子性,隔离性,以及持久性都是为了保证数据库数据的一致性。

⑶ 隔离性(Isolation)

  隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。

  即要达到这么一种效果:对于任意两个并发的事务T1和T2,在事务T1看来,T2要么在T1开始之前就已经结束,要么在T1结束之后才开始,这样每个事务都感觉不到有其他事务在并发地执行。

  关于事务的隔离性数据库提供了多种隔离级别,稍后会介绍到。

⑷ 持久性(Durability)

  持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。

  例如我们在使用JDBC操作数据库时,在提交事务方法后,提示用户事务操作完成,当我们程序执行完成直到看到提示后,就可以认定事务以及正确提交,即使这时候数据库出现了问题,也必须要将我们的事务完全执行完成,否则就会造成我们看到提示事务处理完毕,但是数据库因为故障而没有执行事务的重大错误。

以上介绍完事务的四大特性(简称ACID),现在重点来说明下事务的隔离性,当多个线程都开启事务操作数据库中的数据时,数据库系统要能进行隔离操作,以保证各个线程获取数据的准确性,在介绍数据库提供的各种隔离级别之前,我们先看看如果不考虑事务的隔离性,会发生的几种问题:

1、脏读

脏读是指并发过程中,一个事务处理过程里读取了另一个未提交的事务中的数据。

当一个事务正在多次修改某个数据,而在这个事务中这多次的修改都还未提交,这时一个并发的事务来访问该数据,就会造成两个事务得到的数据不一致。例如:用户A向用户B转账100元,对应SQL命令如下:

update account set money=money+100 where name=’B’;  (此时A通知B)update account set money=money - 100 where name=’A’;

当只执行第一条SQL时,A通知B查看账户,B发现确实钱已到账(此时即发生了脏读),而之后无论第二条SQL是否执行,只要该事务不提交,则所有操作都将回滚,那么当B以后再次查看账户时就会发现钱其实并没有转。

2、不可重复读

  不可重复读是指在对于数据库中的某条数据,一个事务范围内多次查询却返回了不同的数据值,这是由于在查询间隔,被另一个事务修改并提交了。

  例如事务T1在读取某一数据,而事务T2立马修改了这个数据并且提交事务给数据库,事务T1再次读取该数据就得到了不同的结果,发生了不可重复读。

  不可重复读和脏读的区别是,脏读是某一事务读取了另一个事务未提交的脏数据,而不可重复读则是两次读取之间存在另一个事务提交的数据。

  在某些情况下,不可重复读并不是问题,比如我们多次查询某个数据当然以最后查询得到的结果为主。但在另一些情况下就有可能发生问题,例如对于同一个数据A和B依次查询就可能不同,A和B就可能打起来了……

3,幻读

  幻读是事务非独立执行时发生的一种现象。例如事务T1查询整张表中有多少条记录,这时事务T2又对这个表中插入了一行数据。而操作事务T1的用户如果再查看整张表有多少行数据,会发现多出一行数据,其实这行是事务T2添加的,就好像产生幻觉一样,这就是发生了幻读。

  幻读和不可重复读区别是:

  • 不可重复读的重点是修改(update),操作的是某一行数据,需要锁行。同样的条件, 你读取过的数据, 再次读取出来发现值不一样了。
  • 幻读的重点在于新增(insert)或者删除(delete),操作的是整张表,需要锁表。同样的条件, 第1次和第2次读出来的记录数不一样

  

  现在来看看MySQL数据库为我们提供的四种隔离级别:

  ① Serializable (串行化):可避免脏读、不可重复读、幻读的发生。

  ② Repeatable read (可重复读):可避免脏读、不可重复读的发生。

  ③ Read committed (读已提交):可避免脏读的发生。

  ④ Read uncommitted (读未提交):最低级别,任何情况都无法保证。

  以上四种隔离级别最高的是Serializable级别,最低的是Read uncommitted级别,当然级别越高,执行效率就越低。像Serializable这样的级别,就是以锁表的方式(类似于Java多线程中的锁)使得其他的线程只能在锁外等待,所以平时选用何种隔离级别应该根据实际情况。在MySQL数据库中默认的隔离级别为Repeatable read (可重复读)。

  在MySQL数据库中,支持上面四种隔离级别,默认的为Repeatable read (可重复读);而在Oracle数据库中,只支持Serializable (串行化)级别和Read committed (读已提交)这两种级别,其中默认的为Read committed级别。

参考文献:

数据库事务的四大特性以及事务的隔离级别

数据库事务原子性、一致性是怎样实现的?

转载于:https://www.cnblogs.com/loren-Yang/p/7538355.html

数据库事务的四大特性ACID相关推荐

  1. 数据库事务的四大特性以及隔离级别

    本篇文章主要介绍数据库事务的四大特性ACID,以及数据库的隔离级别. 事务 概念 事务指的是满足 ACID 特性的一系列操作.在数据库中,可以通过 Commit提交一个事务,也可以使用 Rollbac ...

  2. 数据库事务的四大特性(ACID)

    数据库事务的四大特性 1,      什么是数据库事务? 数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成. 意思就是一连串的数据库操作,即一串增删查改的集合. 2,   数据库 ...

  3. 不属于mysql事物的特性_mysql基础---事务 事务的四大特性(ACID) 四种隔离级别

    一.事务 mysql中,事务是一个最小的不可分割单元.事务能够保证一个业务的完整性. eg:银行转账 a -> -100 update user set money=money-100; b - ...

  4. 数据库事务及其四大特性

    数据库事务是数据库运行中的逻辑工作单位,单个逻辑工作单元所执行的一系列操作,要么都执行,要么都不执行.例如银行取款事务分为2个步骤(1)存折减款(2)提取现金,2个步骤必须同时完成或者都不完成. 数据 ...

  5. MySQL数据库事务的四大特性

    MySQL数据库事务的四大特性以及事务的隔离级别_l1394049664的博客-CSDN博客_mysql数据库事务 深入学习MySQL事务:ACID特性的实现原理 - 编程迷思 - 博客园

  6. 数据库事务的四大特性和四个隔离级别

    一.数据库事务的四大特性 事物是指作为一个单元的一组有序的数据库操作,单元是不可分割的,如果一组数据的所有操作都执行成功,事物完成,进行事物提交(commit),其修改作用于所有数据库进程.有一个操作 ...

  7. 数据库事务的四大特性和隔离级别

    数据库事务(Database Transaction) ,是指作为单个逻辑工作单元执行的一系列操作,要么全部执行,要么全部都不执行. 一个逻辑工作单元要成为事务,必须满足事务的四大特性(ACID).即 ...

  8. 数据库事务的四大特性以及事务的隔离级别

    本篇讲诉数据库中事务的四大特性(ACID),并且将会详细地说明事务的隔离级别. 如果一个数据库声称支持事务的操作,那么该数据库必须要具备以下四个特性: ⑴ 原子性(Atomicity) 原子性是指事务 ...

  9. 数据库事务的四大特性以及事务的隔离级别详解

    作者 : fjdingsd 来源 : 博客园 本篇讲诉数据库中事务的四大特性(ACID),并且将会详细地说明事务的隔离级别. 如果一个数据库声称支持事务的操作,那么该数据库必须要具备以下四个特性: ⑴ ...

最新文章

  1. 最新语义视觉SLAM综述:面向应用的移动机器人自主导航解决方案
  2. context of your framing
  3. ios调用restful接口_Postman调用https异常解决
  4. 腾讯TAPD发布2018企业敏捷协作数据报告
  5. Python实现简单的记账本功能
  6. 中国现磨咖啡行业白皮书
  7. C语言的变量怎样重启后不变,求解释,怎么能让程序里的变量在关闭后依然保存呢?...
  8. 计算机一级2016版本ms,2016计算机等级一级《MS Office》试题与答案
  9. 简述台式计算机创建家庭组的步骤,如何创建和设置家庭组
  10. 行业术语001--关键绩效指标KPI_NLP_ACL
  11. 《Effective Java 3rd》读书笔记——泛型
  12. Laravel debug bar 调试利器
  13. 《02333软件工程课后习题答案-2011版 王立福》
  14. Origin8 使用教程
  15. java技术栈是指什么,值得一读!
  16. Android apk包生成二维码给他人体验
  17. oracle 控制台使用手册,Oracle-ESS-入门手册
  18. C语言基础学习day04
  19. linux su 资源不可用,CentOS 6/Linux su: 无法设置用户ID: 资源暂时不可用
  20. ESP8266驱动SG90舵机控制开关灯(灯的开关)的折腾记录

热门文章

  1. kegra:用Keras深度学习知识图
  2. 干货 | 你真的了解 Convolutional Neural Networks 么
  3. 【问链财经-区块链基础知识系列】 第二十二课 贸易金融区块链平台的技术机理与现实意义
  4. java客户端服务器代码_Java Socket通信 客户端服务器端基本代码
  5. JZOJ 5393. 【NOIP2017提高A组模拟10.5】Snake vs Block
  6. python 作用域嵌套_python嵌套作用域问题
  7. linux neo4j 服务器,如何在linux服务器上配置Neo4j · Digital World
  8. 最新增值税商品税目编码表_大家好!我叫增值税!这是我的最新最全税率表
  9. KMPLAYER无法播放rmvb格式的解决办法
  10. 知识工程学:一个新的重要研究领域