iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >瞎掰事务(一):四大特性立体关系剖析(最好的理解一致性)
  • 818
分享到

瞎掰事务(一):四大特性立体关系剖析(最好的理解一致性)

摘要

原子性,事务中所有操作是不可再分割的原子单位。事务中所有操作要么全部执行成功,要么全部执行失败; 一致性,事务执行后,数据库状态与其它业务规则保持一致; 隔离性,指在并发操作中,不同事务之间应该隔离开来,使每个并发中的事务不会相互干扰。 持

瞎掰事务(一):四大特性立体关系剖析(最好的理解一致性)

原子性,事务中所有操作是不可再分割的原子单位。事务中所有操作要么全部执行成功,要么全部执行失败; 一致性,事务执行后,数据库状态与其它业务规则保持一致; 隔离性,指在并发操作中,不同事务之间应该隔离开来,使每个并发中的事务不会相互干扰。 持久性, 一旦事务提交成功,事务中所有的数据操作都必须被持久化到数据库中,即使提交事务后,数据库马上崩溃,在数据库重启时,也必须能保证通过某种机制恢复数据 比较难理解的是一致性的表述。有一种补充解释是一致性保证的是从一种状态到另一种状态的一致维护,而保证不出现中间状态。当注意力放在中间状态时,一致性与隔离性的定义有重叠,当注意力放在两种状态的切换,又与原子性的定义有重叠。所以这样的解释对于深入理解事务的四大特性是不完美的。

四大特性的深入理解

一个完整的事务系统需要数据库,事务框架,业务逻辑三层组成。数据库是事务构成的基石,这也是数据库区别于文件系统的主要特征。在数据库层级上,提供了事务隔离级别的实现。一般的事务隔离级别分为四级 读未提交:read uncommitted 读已提交:read committed 可重复读:repeatable read 串行化:serializable 本质上,事务的隔离性是由数据库层级上的隔离级别保证的。持久性也是数据库层级所保证的,这个很容易理解。到了原子性,情况发生了变化。 数据库层级提供了commit 和 rollback 的函数,但是这没有提供全部成功和全部失败的原子性完全保证,仍需要事务框架的支持。这就是事务托管方。事务托管方可以是持久化框架如mybatis,Hibernate等,也有可能是更高一点的框架,如spring framework,还有一种比较容易被忽视的,就是手动编写的完整的具有事务控制的sql 脚本,这与其他事务托管方所完成的工作几乎一样。当然最常见的还是spring 的事务模块,在下一篇我们可以对spring 事务的细节展开,这里我们继续扣题发挥。最后就是一致性了。一致性的保证是最特殊的,需要数据库,事务框架,业务逻辑自下而上的共同维护。数据库层级提供持久性和隔离性的保证,并提高原子性的能力与事务框架共同提供原子性保证,基于这些下层能力的基础,才能最终在顶层业务的逻辑层完成一致性的保证。所以一致性是数据库状态与其他业务规则保持一致。

用转账的例子 A账号往B账号里转5000,这时候数据库要执行两行代码: A:减去5000 B:加上5000 这是一致性情况,如果代码为 A:减去5000 B:加上5001 这就是对一致性的破坏。

所以认为隔离性和原子性与一致性是有重叠的,更好的解释是他们的关系是因果的链式关系。再看一下他们”非重叠的部分“

隔离级别在RR以上,一致性和隔离性是”吻合“的,但在RR之下,事务内的中间状态对其他事务而言是暴露的。这是对关于一致性对可见性约束的破坏,另一方面也说明他们管辖范围的不同。至于更多的不同或侧重点不需一一赘言。

这里瞎掰了事务四大特性立体的关系,关于更多或者不同的理解您可以留言讨论。后面关于事务有更多的分析,欢迎拍砖

您可能感兴趣的文档:

--结束END--

本文标题: 瞎掰事务(一):四大特性立体关系剖析(最好的理解一致性)

本文链接: https://www.lsjlt.com/news/4901.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • sql中exists具体用法
    exists 子查询用于检查外层查询中的行是否存在匹配记录,用法如下:包含在 select 语句的 where 子句中。返回布尔值 true (存在匹配) 或 fal...
    99+
    2024-05-15
  • sql中union用法
    union 运算符在 sql 中用来合并相同结构的表或子查询的结果集,排除重复行。它具有以下用法:合并具有相同列名和数据类型的多个表或子查询的结果集合并为一个。排除结果集中重复...
    99+
    2024-05-15
  • sql中索引的用法
    sql 中索引是一种通过创建数据指针来提高查询性能的技术,主要用于where、order by、join和group by子句。索引类型包括聚集索引、非聚集索引、主键索引、唯一...
    99+
    2024-05-15
    聚合函数
  • sql中nullif怎么用
    sql 中的 nullif() 函数,用于比较两个表达式并返回较小的值,若均为 null 则返回 null,语法为 nullif(expression1, expression2)。可用...
    99+
    2024-05-15
  • sql中decode用法
    decode 函数根据输入表达式值将值转换为另一个值,语法为 decode(expression, value1, result1, value2, result2, ..., defa...
    99+
    2024-05-15
  • sql中怎么删除字段中部分字符串
    在 sql 中删除字段中部分字符串,可以使用 replace() 函数。语法为:update table_name set column_name = replace(column_na...
    99+
    2024-05-15
  • sql中怎么删除字符串
    在 sql 中,可以使用以下函数删除字符串中的字符:1. substr() 截取子字符串;2. replace() 替换子字符串;3. ltrim() 删除左空格;4...
    99+
    2024-05-15
  • patindex在sql中的用法
    patindex 函数在 sql 字符串中搜索指定模式的文本,并返回其第一个匹配项的开始位置。它根据给定的模式和字符串,返回匹配项在字符串中的第一个字符的位置,如果未找到匹配项,则返回 ...
    99+
    2024-05-15
  • sql中怎么修改列
    sql 中修改表列涉及两个步骤:首先,可通过 alter table 语句添加、删除或重命名列;其次,可使用 modify 子句修改列属性(数据类型、约束、默认值等)。这些属性包括 no...
    99+
    2024-05-15
  • sql中extend的用法
    sql 中 extend 用于向表中添加新列。它使用以下步骤: 1. 使用 alter table 语句指定表名; 2. 使用 extend 子句添加新列的名称和数据类型; 3. 使用分...
    99+
    2024-05-15
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作