acid

ACID,指数据库事务正确执行的四个基本要素的缩写。包含:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。一个支持事务(Transaction)的数据库系统,必需要具有这四种特性,否则在事务过程(Transaction processing)当中无法保证数据的正确性,交易过程极可能达不到交易方的要求。

  原子性

  整个事务中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。

  一致性

  在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。

  隔离性

  两个事务的执行是互不干扰的,一个事务不可能看到其他事务运行时,中间某一时刻的数据。

  持久性

  在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。

  由于一项操作通常会包含许多子操作,而这些子操作可能会因为硬件的损坏或其他因素产生问题,要正确实现ACID并不容易。ACID建议数据库将所有需要更新 以及修改的资料一次操作完毕,但实际上并不可行。

  目前主要有两种方式实现ACID:第一种是Write ahead logging,也就是日志式的方式。第二种是Shadow paging。

回滚

 删除由一个或多个部分完成的事务执行的更新。为在应用程序、数据库或系统错误后还原数据库的完整性,需要使用回滚。

  回滚泛指程序更新失败, 返回上一次正确状态的行为。

  回滚对程序员意味着非常严重的失误。因为回滚次数往往与程序员的薪金直接联系。主流互联网公司通常都将回滚定位为最严重的事故。

  回滚与恢复有本质的区别。

  而升级回滚则是指因升级中所发生的意外而自动回滚

1        事务并发处理(面试的意义更大)

a)  事务:ACID

         i.   Atomic ConsistencyItegrity Durability

b)  事务并发时可能出现的问题:

第一类丢失更新(Lost Update)


时间


取款事务A


存款事务B


T1


开始事务


 


T2


 


开始事务


T3


查询账户余额为1000元


 


T4


 


查询账户余额为1000元


T5


 


汇入100元把余额改为1100元


T6


 


提交事务


T7


取出100元把余额改为900 元


 


T8


撤销事务


 


T9


余额恢复为1000元(丢失更新)


 

   

    dirtyread脏读(读到了另一个事务在处理中还未提交的数据)


时间


取款事务A


存款事务B


T1


开始事务


 


T2


 


开始事务


T3


 


查询账户余额为1000元


T4


 


汇入100元把余额改为1100元


T5


查询账户余额为1100元(读取脏数据)


 


T6


 


回滚


T7


取款1100


 


T8


提交事务失败


 

 

    non-repeatableread 不可重复读


时间


取款事务A


存款事务B


T1


开始事务


 


T2


 


开始事务


T3


查询账户余额为1000元


 


T5


 


汇入100元把余额改为1100元


T5


 


提交事务


T6


查询帐户余额为1100元


 


T8


提交事务


 

 

    secondlost update problem 第二类丢失更新(不可重复读的特殊情况)


时间


取款事务A


存款事务B


T1


 


开始事务


T2


开始事务


 


T3


 


查询账户余额为1000元


T4


查询账户余额为1000元


 


T5


 


取出100元把余额改为900元


T6


 


提交事务


T7


汇入100元


 


T8


提交事务


 


T9


把余额改为1100元(丢失更新)


 

 

    phantomread 幻读


时间


查询学生事务A


插入新学生事务B


T1


开始事务


 


T2


 


开始事务


T3


查询学生为10人


 


T4


 


插入1个学生


T5


查询学生为11人


 


T6


 


提交事务


T7


提交事务


 

c)  数据库的事务隔离机制

        i.   查看 java.sql.Connection 文档

       ii.   1:read-uncommitted  2:read-committed  4:repeatable read  8:serializable(数字代表对应值)

为什么取值要使用 1 2 4 8而不是 1 2 3 4

1=0000  2=0010 4=01008=1000(位移计算效率高)

1.     只要数据库支持事务,就不可能出现第一类丢失更新

2.     read-uncommitted(允许读取未提交的数据) 会出现dirty read, phantom-read,

non-repeatableread 问题

3.     read-commited(读取已提交的数据项目中一般都使用这个)不会出现dirty read,因为只有另

一个事务提交才会读出来结果,但仍然会出现 non-repeatable read 和 phantom-read

   使用read-commited机制可用悲观锁乐观锁来解决non-repeatable read和
phantom-read问题

4.     repeatableread(事务执行中其他事务无法执行修改或插入操作    较安全)

5.     serializable解决一切问题(顺序执行事务不并发,实际中很少用)

d)  设定hibernate的事务隔离级别(使用hibernate.connection.isolation配置取值1、2、4、8)

        i.   hibernate.connection.isolation= 2(如果不设 默认依赖数据库本身的级别)

       ii.   用悲观锁解决repeatable read的问题(依赖于数据库的锁)

(详见项目 hibernate_3100_Hibernate_Concurrency_Pessimistic_Lock)

1.     select ... for update

2.      使用另一种load方法--load(xx.class , i ,
LockMode.Upgrade)

a) LockMode.None无锁的机制,Transaction结束时,切换到此模式

b) LockMode.read在査询的时候hibernate会自动获取锁

c) LockMode.write insert  updatehibernate 会自动获取锁

d) 以上3种锁的模式,是hibernate内部使用的(不需要设)

e) LockMode.UPGRADE_NOWAIT是 ORACLE 支持的锁的方式

e)  Hibernate(JPA)乐观锁定(ReadCommitted)

(详见项目hibernate_3200_Hibernate_Concurrency_Optimistic_Lock)

实体类中增加version属性(数据库也会对应生成该字段,初始值为0),并在其get方法前加

@Version注解,则在操作过程中没更新一次该行数据则version值加1,即可在事务提交前判断该数据是否被其他事务修改过.

            @Version


时间


转账事务A


取款事务B


T1


 


开始事务


T2


开始事务


 


T3


查询学生为10人


查询账户余额为1000 version=0


T4


查询账户余额为1000 version=0


 


T5


 


取出100 把余额改为900 version=1


T6


 


提交事务


T7


汇入100元


 


T8


提交事务 ? version>0

throw Exception


 


T9


把余额改为1100元(丢失更新)


 

 

时间: 2024-09-25 10:12:48

acid的相关文章

ACID与CAP定理

ACID:RMDB的4个基本要素         ACID,指数据库事务正确执行的四个基本要素的缩写.包含:原子性(Atomicity).一致性(Consistency).隔离性(Isolation).持久性(Durability).一个支持事务(Transaction)的数据库系统,必需要具有这四种特性,否则在事务过程(Transaction processing)当中无法保证数据的正确性,交易过程极可能达不到交易方的要求.     原子性         整个事务中的所有操作,要么全部完成,

关于PHP与acid在win7中配置的问题

问题描述 关于PHP与acid在win7中配置的问题 allow_call_time_pass_reference在PHP5.6中已经不被支持了吗

Hive 0.13发布 增加ACID特性

什么是ACID,有什么作用? ACID代表数据库事务中的4个特性,原子性(任何一个数据库操作要么被完整执行,要么完全不执行).一致性(一旦应用程序执行了一个操作,操作的结果对于每一个之后的操作都是可见的).隔离性(一个用户的操作不会对其他用户产生意料之外的副作用).持久性(一旦一个操作被完成,这些操作也将被记录下来,即使机器或者系统出现故障,也要保证这些记录的完整性).这些特性一直被认为是事务功能的重要组成部分. 在最近发布的Hive 0.13中,事务的原子性.一致性和持久性在分区层得到保证,隔

【转载】ACID、Data Replication、CAP与BASE

[ACID]      在传统数据库系统中,事务具有 ACID 4 个属性( Jim Gray 在<事务处理:概念与技术>中对事务进行了详尽的讨论). 原子性(Atomicity):事务是一个原子操作单元,其对数据的修改,要么全都执行,要么全都不执行. 一致性(Consistent):在事务开始和完成时,数据都必须保持一致状态.这意味着所有相关的数据规则都必须应用于事务的修改,以保持数据的完整性:事务结束时,所有的内部数据结构(如B树索引或双向链表)也都必须是正确的. 隔离性(Isolatio

MySQL事务内幕与ACID

       MySQL的事务实现严格遵循ACID特性,即原子性(atomicity),一致性(consistency),隔离性(isolation),持久性(durability).为了避免一上来就陷入对ACID的概念理解,我们直接先谈MySQL事务实现机制.             MySQL提供了两种事务型的存储引擎:InnoDB和NDB Cluster.另外还有一些第三方存储引擎也支持事务,比较知名的包括XtraDB和PBXT.下面以InnoDB来说明.             MySQ

最新版本的Hive 0.13发布,增加ACID特性

近日发布的Hive 0.13中采用了ACID语义的事务机制,在分区层保证事务原子性.一致性和持久性,并通过开启Zoohttp://www.aliyun.com/zixun/aggregation/19458.html">Keeper或内存中的锁机制保证事务隔离性.数据流摄取.缓慢变化维.数据重述这些新的用例在新版本中成为了可能,当然新版Hive中也还存在一些不足,Hive新版本具体带来哪些改变呢?作者Alan Gates为我们带来了精彩分析. 什么是ACID,有什么作用? ACID代表数据

HIVE 新特性 ACID 初试

在 Hive 0.14 之前,Hive QL 一直不支持insert.update.delete 操作,这显然很不方便,尤其是在构建数据仓库的过程中,一个比较常见的例子是维度表经常需要更新某列,在 Hive 中需要更新历史所有数据,这显然是不合理的. 在 Hive 0.14 版本,支持了行级别的 ACID 与 Transactions,这也就解决了上面的问题. 本文主要讲解如何在 Hive 0.14 配置,使得支持上述两个特性,相关原理及性能分析后面再单独写一篇文章来分析. 相关软件说明: Hi

《解读NoSQL》——2.5 比较ACID和BASE——两种可靠的数据库事务方法

2.5 比较ACID和BASE--两种可靠的数据库事务方法 兼顾性能和一致性的事务控制在分布式计算环境下是很重要的.通常会在两种事务控制模型中选择其一使用:ACID用于RDBMS,BASE用在很多NoSQL系统.即使数据库事务只有很少一部分需要事务完整性,但了解RDBMS和NoSQL系统能够采用这些事务控制策略也是很重要的.这两种模型的区别在于应用开发人员所付出的努力和事务控制所发生的位置(层级). 让我们从一个简单的银行业务案例来展现一个可靠的事务.如今,许多人都有两个银行账户:储蓄账户和支票

数据库事务ACID

数据库事务 数据库事务有严格的定义,它必须同时满足4个特性:原子性(Atomic).一致性(Consistency).隔离性(Isolation)和持久性(Durability),简称ACID.下面是对每个特性的说明. 原子性:表示组成一个事务的多个数据库操作是一个不可分割的原子单元,只有所有的操作执行成功,整个事务才提交,事务中任何一个数据库操作失败,已经执行的任何操作都必须撤销,让数据库返回到初始状态. 一致性:事务操作成功后,数据库所处的状态和它的业务规则是一致的,即数据不会被破坏.如从A