CreateArtTechnology
/ Blog
Login
最新文章
Java
语言相关
库相关
虚拟机相关
CreateArtTechnology
项目搭建
使用的工具
自研的工具
开源工具
ELK
ElasticSearch
Jenkins
Markdown
GraphQL
Arthas
生产工具
Linux
Nginx
VersionControl
Subversion
Git
Redis
Archiva
Maven
Zookeeper
Spring
SpringBoot
MySql
HBase
Cassandra
容器化
Docker
Kubernetes
服务容器化从零开始
未分类笔记
算法相关
概念相关
豆知识
机器学习
机器学习从零开始
数据库事务的ACID、隔离级别、传播特性
12
2019-05-22 20:38:12
概念相关
## 数据库事务的ACID特性 **Atomic 原子性** 组成事务的操作不可分割,只有全部执行成功才提交,任何一部分操作失败都必须将整个事务回滚。 即事务里的每个操作,要么都发生,要么都不发生。 **Consistency 一致性** 数据库宗师从一个一致性的状态转换到另一个一致性的状态。 即不应该出现异常数据。 **Isolation 隔离性** 多个事务执行时,一个事务在最终提交之前对其他事务“通常来说”是不可见的。 一般而言,完全保证隔离性会影响性能,因而有些数据库在处理隔离性时有所妥协,对事务的隔离性分级,不同的隔离级别会引起脏读、不可重复读、幻读等问题,后续介绍。 **Durability 持久性** 执行结果持久化保存,可故障恢复,但不再回滚。 ## 事务隔离级别不同产生的影响 **脏读** 一个事务读取到另一事务未提交的更新新据。当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据,那么另外一个事务读到的这个数据是脏数据,依据脏数据所做的操作也可能是不正确的。 **关键:读到未提交的错误数据。** ![](/img/pic/2019052220371840319_png_370_481_47734) > 读到错误数据 **不可重复读** 在同一事务中,多次读取同一数据返回的结果有所不同。换句话说就是,后续读取可以读到另一事务已提交的更新数据。相反,“可重复读”在同一事务中多次读取数据时,能够保证所读数据一样,也就是,后续读取不能读到另一事务已提交的更新数据。 **关键:每次读取结果可能不一样。** ![](/img/pic/2019052220372284020_png_321_432_34945) > 读的结果不同 **幻读** 事务T1执行一次查询,然后事务T2新插入一行记录,这行记录恰好可以满足T1所使用的查询的条件。然后T1又使用相同的查询再次对表进行检索,但是此时却看到了事务T2刚才插入的新行。这个新行就称为“幻像”,因为对T1来说这一行就像突然出现的一样。 **关键:可能读到新出现的行。** ![](/img/pic/2019052220372849221_png_359_472_37216) > 出现新内容 ## 事务的隔离级别 **ISOLATION_DEFAULT** 默认隔离级别,MySql的默认隔离级别是Repeatable Read。 **ISOLATION_READ_UNCOMMITTED** 允许读取尚未提交的修改。 几乎就没有将事务隔离,事务的资源共享,所以脏读、幻读、不可重复读都有。 可以理解为直接在原始资源上读、写。 **ISOLATION_READ_COMMITTED** 允许从已经提交的事务读取。 其他事务可能修改本事务的数据或其他数据,因此还是会有幻读和不可重复读。 但是不会读到错误数据,不会脏读。 可以理解为在原始资源读,在事务自己的资源副本上写。 **ISOLATION_REPEATABLE_READ** 对相同字段的多次读取的结果是一致的,除非数据被当前事务自身修改。 为了确保可重复读,相当于对当前已有的数据进行快照,不会有脏读和不可重复读。 但是不能锁定目前没有的数据,因此可能有幻读。 可以理解为在资源副本+副本范围外的资源池上读,在资源副本上写。 **ISOLATION_SERIALIZABLE** 完全服从ACID隔离原则,事务串行化执行,确保不发生脏读、不可重复读、和幻读,但执行效率最低。 | 隔离级别 | 脏读|不可重复读 | 幻读 | 加锁读 | |---|---|---|---|---|---| |Read Uncommitted|Y|Y|Y|N| |Read Committed|N|Y|Y|N| |Repeatable Read|N|N|Y|N| |Serializable|N|N|N|Y| ## 事务的传播属性 **PROPAGATION_REQUIRED** 必须在一个具有事务的上下文中运行:如果当前没有(外层)事务,就新建一个事务;如果当前存在(外层)事务,则加入到当前(外层)事务中。(如果被调用方法发生异常,那么调用方法和被调用方法的事务都将回滚)这是最常用的选择。 **PROPAGATION_SUPPORTS** 支持当前(外层)事务,如果当前没有(外层)事务,就以非事务方式执行。 **PROPAGATION_MANDATORY** 强制使用当前(外层)事务,如果当前没有(外层)事务,就抛出异常。 **PROPAGATION_REQUIRES_NEW** 新建一个事务,并在该事务中运行,如果当前存在(外层)事务,则先将当前(外层)事务挂起。 **PROPAGATION_NOT_SUPPORTED** 以非事务方式执行操作:如果当前存在(外层)事务,就把当前(外层)事务挂起。 **PROPAGATION_NEVER** 以非事务方式执行:如果当前存在(外层)事务,则抛出异常。 **PROPAGATION_NESTED** 以嵌套方式执行:如果当前存在(外层)事务,则以嵌套方式独立运行于自己的事务中,不影响当前(外层)事务,而当前(外层)事务如果回滚,则该事务也必须回滚;如果当前不存在(外层)事务,则执行与PROPAGATION.REQUIRED类似的操作。 ## 补充 **MySql中的事务支持** InnoDB支持所有事务隔离级别。 MyISAM不支持事务,无法回滚。 ## 参考资料 [【数据库】数据库四大特性ACID - ranran0224的博客 - CSDN博客](https://blog.csdn.net/ranran0224/article/details/78427541)
发布文章 101
文章被阅读 1597
最近修改
什么是“丝滑”的曲线
2021-12-08 15:19:20
高效空间数据索引R树及其批量加载方法STR简介
2021-09-29 20:33:37
关于分库分表的一些事儿
2021-06-25 11:51:25
获得诺奖的稳定匹配理论之TTC算法与GS算法
2021-03-14 23:04:48
算法小白的机器学习入门实践,从零到上线
2021-01-13 14:28:27
分站宗旨
一站式资料平台,减少重复检索,减少重复采坑。