如何理解数据库事务中的一致性的概念?
来源:互联网 发布:linux 线程退出 编辑:程序博客网 时间:2024/06/17 08:11
阅读全文
0 0
- 如何理解数据库事务中的一致性的概念?
- 数据库事务的一致性
- 数据库事务的概念、理解【为了理解nosql】
- 数据库中的事务理解
- 理解数据库中的事务
- 数据库事务的概念
- 理解事务的一致性和原子性
- 事务一致性理解
- 利用事务维持数据库的一致性
- 事务的acid概念理解
- 数据库事务的理解
- 数据库事务的理解
- 请教~~~如何保持在两个数据库(sql server 2000)之间,保持事务的一致性
- JDBC中的事务的概念
- 关于数据库事务的理解
- 数据库事务原子性、一致性是怎样实现的?
- JDBC进行mysql数据库操作并保持事务的一致性
- 如何理解数据库事务隔离级别
- vs常用快捷键(va插件)
- 数据库自动更新的实现--php项目(1)
- JAVA中this和super的用法
- Servlet实现文件下载
- 三十分钟熟悉es6(es6日常使用功能总结)
- 如何理解数据库事务中的一致性的概念?
- 欢迎使用CSDN-markdown编辑器
- Windows Practice_文件_文件分割器(三)
- javascript 红黑树算法与说明
- oracle数据库总结(一)
- mysql 相关自动化操作
- 建模总结
- World文档编写标准和方法总结
- 面试常见的排序
12 条评论
我认为基本概念弄错了。如果按照答主的举的事务操作(不太恰当的例子)为:A=A+2000;B=B+3000;执行成功以后,从一个一致性状态到另一个一致性状态,就说明保证了数据一致性,如果在执行的过程中,发生了进程中断,导致A与B变成其他不可知的数据(此时没回滚),才说明数据不一致。数据一致性,指的是必须保证从一个一致性状态到另一个一致性状态。另外,事务中数据一致性与多副本(文中说的分布式系统那段)一致性,就是ACID和CAP中的C,不能划等号。另外,3副本的问题,答主说的是强同步复制问题,其实超过一半的数据更新成功,是可以返回成功的,看Paxos或者raft。喷完了,学生猿,请随意拍砖。
能否再详细定义一下,什么是一致性状态?否则的话是循环定义。
不严格的说,从起始状态(空)开始,同一份数据的不同副本(所有或者超过半数)均相同,说明处于一致性状态。严格的讨论(非定义)关于一致性状态,请移步:ACID - Wikipedia 中 Consistency: Theconsistency property ensures that any transaction will bring the database from one valid state to another. 还有CAP theorem - Wikipedia中 Consistency: Every read receives the most recent write or an error 。关于状态之间的迭代或者变迁,请移步:知乎 - 知乎 其中回答者
LynnCui是phxpaxos的核心开发者,回答的很详细。还有工程实现部分我看的是phxpaxos。原理介绍:微信自研生产级paxos类库PhxPaxos实现原理介绍 ,源码:tencent-wechat/phxpaxos 。这次不喷了,但是作为学生猿,还是请随意拍砖。因为填坑才是进步…
你要区分两个概念,分布式情况下的数据一致性,与集中式情况下的数据一致性。
分布式情况下的数据一致性应该分歧不大,只不过是定义严格或者不严格而已。
而对于集中式的情况,因为数据就只存储在服务器,没有数据副本的概念,所以这个时候,数据一致性就需要你自己来定义,你所说的acid链接里的valid状态,其实由你自己来定义。
更一般的说,数据一致性通常指关联数据之间的逻辑关系是否正确和完整。而数据存储的一致性模型则可以认为是存储系统和数据使用者之间的一种约定。如果使用者遵循这种约定,则可以得到系统所承诺的访问结果。
非常高兴你的讨论,因为有这样的疑惑是很正常的,在我上课的时候,这其实也一直是一个难点。
先简单说下,“一个事务中A的余额和B的余额同时增长10%”这样的情况,是否保持了一致性,要看你的定义,如果我对一致性的定义是“A与B的余额总和不变”,那么一致性就被破坏,系统处于不一致和状态,而如果你对一致性的定义是“A与B增加的幅度相同”,那么一致性就没有被破坏,系统还是处于一致性的状态。或者说,数据库管理系统根本就不知道一致性是个啥东西,这都是用户通过代码来进行定义的。
其实深入的讨论下有关事务的概念,就会明白这个一致性的定义了——如果不使用事务,那么在数据库执行多条语句的时候,有可能中间会出现问题而导致只执行了部分语句,因此,我们在这多条语句前面加上begin transaction,最后加上end transaction,这就是很清楚的标明了,在这些语句执行前,系统是处于一致性状态的,而在这些语句执行后,系统也是处于一致性状态的,至于这个一致性状态的定义,则是由用户通过这些语句来表达的。那么如果语句执行完成了,事务提交,这时候数据库系统就认为又到了一个一致性状态,而如果出现问题,系统则将操作回滚,返回初始状态,因为这也是一个一致性状态。而如果出现故障重启等事件时,数据库管理系统在重启后就会分析日志,将所有begin/end全都有的事务跳过或重做,而只有begin没有end的事务则undo,从而保证数据库在可用的时候都是一致性状态。
OK,结题!