数据库的ACID

来源:互联网 发布:cydia软件源微信抢红包 编辑:程序博客网 时间:2024/06/07 07:48
ACID,是指在可靠数据库管理系统(DBMS)中,事务(transaction)所应该具有的四个特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability.这是可靠数据库所应具备的几个特性.


一致性:

一致性是指在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。这是说数据库事务不能破坏关系数据的完整性以及业务逻辑上的一致性。

1.案例

       对银行转帐事务,不管事务成功还是失败,应该保证事务结束后ACCOUNT表中aaabbb的存款总额为2000元。

2.解决方法

保障事务的一致性,可以从以下两个层面入手

       2.1数据库机制层面

       数据库层面的一致性是,在一个事务执行之前和之后,数据会符合你设置的约束(唯一约束,外键约束,Check约束等)和触发器设置。这一点是由SQL SERVER进行保证的。比如转账,则可以使用CHECK约束两个账户之和等于2000来达到一致性目的

       2.2业务层面

   对于业务层面来说,一致性是保持业务的一致性。这个业务一致性需要由开发人员进行保证。当然,很多业务方面的一致性,也可以通过转移到数据库机制层面进行保证。


数据库事务:
开启事务:BEGIN;
数据库操作:。。。。
提交事务:COMMIT;---->数据成功修改
回滚事务:ROLLBACK;------>数据修改失败,回滚到事务前状态

事务隔离级别:

隔离级别

脏读

丢失更新

不可重复读

幻读

并发模型

更新冲突检测

未提交读:Read Uncommited

悲观

已提交读:Read commited

悲观

可重复读:Repeatable Read

悲观

可串行读:Serializable

悲观

使用方法:

未提交读:SET TRANSACTION ISOLATION LEVEL Read Uncommited

已提交读:SET TRANSACTION ISOLATION LEVELRead commited

可重复读:SET TRANSACTION ISOLATION LEVEL Repeatable Read

可串行读:SET TRANSACTION ISOLATION LEVELSerializable


1.1脏读

       脏读意味着一个事务读取了另一个事务未提交的数据,而这个数据是有可能回滚的;如下案例,此时如果事务1回滚,则B账户必将有损失。

     

 

图片引用:http://blog.csdn.net/shuaihj/

       1.2不可重复读

    不可重复读意味着,在数据库访问中,一个事务范围内两个相同的查询却返回了不同数据。这是由于查询时系统中其他事务修改的提交而引起的。如下案例,事务1必然会变得糊涂,不知道发生了什么。

 

图片引用:http://blog.csdn.net/shuaihj/

       1.3幻读(虚读)

    幻读,是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样.

  

 

图片引用:http://blog.csdn.net/shuaihj/

       1.4丢失更新

       两个事务同时读取同一条记录,A先修改记录,B也修改记录(B是不知道A修改过),B提交数据后B的修改结果覆盖了A的修改结果。

 



InnoDB锁机制:
共享锁:可对锁定范围的数据进行读操作。(行级锁:多个用户可同时读取不同行数据)
        Select语句默认加共享锁-----》多用户可同时查询一行数据
排它锁:可对锁定范围的数据进行写操作。(行级锁:多个用户不可同时写数据,需要第一个事务commit完成,释放锁后第二个事务才能写操作)
        DML语句(update,delete,insert)默认加排他锁。-----》用户进行行数据修改操作时,其它用户不能对同一行数据进行修改操作。




原创粉丝点击