博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
对事务的特性ACID的理解
阅读量:6592 次
发布时间:2019-06-24

本文共 1889 字,大约阅读时间需要 6 分钟。

                                                                                            对事务的特性ACID的理解

数据库的事务必须具备ACID特性,ACID是指 Atomicity(原子性)、Consistensy(一致性)、Isolation(隔离型)和Durability(持久性)的英文缩写。

 

1、原子性(Atomicity

事务包装的一组sql,要么都执行成功,要么都失败。这些操作是不可分割的。

2、一致性(Consistency

        数据库的数据状态是一致的。

事务的成功与失败,最终数据库的数据都是符合实际生活的业务逻辑。一致性绝大多数依赖业务逻辑和原子性。

3、持久性:(Durability

事务成功提交之后,对于数据库的改变是永久的。哪怕数据库发生异常,重启之后数据亦然存在。

4、隔离性(Isolation

        一个事务的成功或者失败对于其他的事务是没有影响。2个事务应该相互独立。

 

事务的隔离级别

如果不考虑事务的隔离性,由于事务的并发,将会出现以下问题:

1、脏读 -- 最严重,杜绝发生

2、不可重复读

3、幻读(虚读)

 脏读:指一个事务读取了另外一个事务 未提交的数据。

          一个事务读取了另一个事务没有提交的数据,非常严重。应当尽量避免脏读。

 

 不可重复读:在一个事务内多次读取表中的数据,多次读取的结果不同。

 

  幻读(虚读)

 

 

 

 隔离级别:如何解决问题

 

l  数据库规范规定了4种隔离级别,分别用于描述两个事务并发的所有情况。

  1. read uncommitted 读未提交,一个事务读到另一个事务没有提交的数据。

a)       存在:3个问题(脏读、不可重复读、虚读)。

b)       解决:0个问题

  1. read committed 读已提交,一个事务读到另一个事务已经提交的数据。

a)       存在:2个问题(不可重复读、虚读)。

b)       解决:1个问题(脏读)

  1. repeatable read:可重复读,在一个事务中读到的数据始终保持一致,无论另一个事务是否提交。

a)       存在:1个问题(虚读)。

b)       解决:2个问题(脏读、不可重复读)

  1. serializable 串行化,同时只能执行一个事务,相当于事务中的单线程。

a)       存在:0个问题。

b)       解决:3个问题(脏读、不可重复读、虚读)

 安全和性能对比

       安全性:serializable > repeatable read > read committed > read uncommitted

     性能 : serializable < repeatable read < read committed < read uncommitted

常见数据库的默认隔离级别:

    MySql:repeatable read

   Oracle:read committed

 

  演示

 查询数据库的隔离级别

show variables like '%isolation%';或select @@tx_isolation;

设置数据库的隔离级别

set session transaction isolation level 级别字符串

 级别字符串:read uncommitted、read committed、repeatable read、serializable

  例如:set session transaction isolation level read uncommitted;

 

	读未提交:read uncommitted	A窗口设置隔离级别	AB同时开始事务	A 查询	B 更新,但不提交	A 再查询?-- 查询到了未提交的数据	B 回滚	A 再查询?-- 查询到事务开始前数据	读已提交:read committed	A窗口设置隔离级别	AB同时开启事务	A查询	B更新、但不提交	A再查询?--数据不变,解决问题【脏读】	B提交	A再查询?--数据改变,存在问题【不可重复读】	可重复读:repeatable read	A窗口设置隔离级别	AB 同时开启事务	A查询	B更新, 但不提交	A再查询?--数据不变,解决问题【脏读】	B提交	A再查询?--数据不变,解决问题【不可重复读】	A提交或回滚	A再查询?--数据改变,另一个事务	串行化:serializable	A窗口设置隔离级别	AB同时开启事务	A查询	B更新?--等待(如果A没有进一步操作,B将等待超时)	A回滚	B 窗口?--等待结束,可以进行操作

  

转载于:https://www.cnblogs.com/daiwei1981/p/9338420.html

你可能感兴趣的文章
OCM_第十一天课程:Section5 —》数据仓库
查看>>
水晶报表
查看>>
[转载]测试程序执行时间
查看>>
[转载]回调函数
查看>>
kettle-多文件合并
查看>>
GitHub for Windows一般操作
查看>>
MyEclipse6.5的反编译插件的安装
查看>>
Jenkins + Ansible + Gitlab之ansible篇
查看>>
cogs 539. 牛棚的灯
查看>>
SQL SERVER 备份数据库到指定路径语句
查看>>
3.Knockout.Js(属性绑定)
查看>>
v140平台工具集与v110工具集选择
查看>>
EF6+Sqlite连接字符串的动态设置
查看>>
下拉加载更多
查看>>
您是哪一种类型的老板?
查看>>
SQL SERVER 2012 只能识别20个CPU的问题
查看>>
设计模式(十)外观模式
查看>>
C/C++语言中Static的作用详述
查看>>
[Android Samples视频系列之ApiDemos] App-Activity-Recreate
查看>>
ASP开发基础
查看>>