Mysql数据库事务 一致性的理解

对于MySQL数据库一致性的理解

事务的产生

首先,我们需要搞清楚为什么会出现事务.

Transactions are not a law of nature; they were created with a purpose, namely to simplify the programming model for applications accessing a database. By using transactions, the application is free to ignore certain potential error scenarios and concurrency issues, because the database takes care of them instead (we call these safety guarantees).

这段文字大体含义就是,事务的产生,其实是为了当应用程序访问数据库的时候,事务能够简化我们的编程模型,不需要我们去考虑各种各样的潜在错误和并发问题.可以想一下当我们使用事务时,要么提交,要么回滚,我们不会去考虑网络异常了,服务器宕机了,同时更改一个数据怎么办对吧?因此事务本质上是为了应用层服务的.而不是伴随着数据库系统天生就有的

事务的四大特性

事务就是一组原子性的SQL操作或者一个独立的工作单元,事务内的语句要么全部执行成功,要么全部执行失败。
事务是指对系统进行的一组操作,为了保证系统的完整性,事务具有ACID特性,具体如下:

原子性(Atomic)
一个事务包含多个操作,这些操作要么全部执行,要么全都不执行
实现事务的原子性,是基于日志的Redo/Undo机制

一致性(Consistency)
一致性是指事务使得系统从一个一致的状态转换到另一个一致状态。 事务的一致性决定了一个系统设计和实现的复杂度,也导致了事务的不同隔离级别。

隔离性(Isolation)
隔离性侧重指事务之间相互隔离,不受影响,这个与事务设置的隔离级别有密切的关系。

持久性(Durability)
事务提交后,对系统的影响是永久的。

简单理解一致性
看到网上有文章说,事务的AID是数据库的特征,也就是依赖数据库的具体实现。而唯独这个C,实际上它依赖于应用层,也就是依赖于开发者。
这里的一致性,是指数据从一种正确的状态,跳转到另一种正确的状态。什么是正确的状态?这就涉及到数据库库表设计以及应用层代码逻辑。拿最简单的转账来说明:

账户A转1000到账户B
应用逻辑上的正确性:
1.账户A和账户B在此次事务执行前后(不考虑其他事务对AB账号的操作),账户余额总和的一致性;
2.A转账的金额,必须小于等于自己的账户余额,即事务提交时,A的账户余额不能为负数(可以通过数据库约束,保证账户jine的字段值大于等于0)。
数据库设计上的正确性:
1.账户余额字段,可能在设计的时候,存在数值大小的约束,那么在事务提交时,B的账户余额不能超出这个范围

简单理解:转账过程中,如果未满足以上的任意一项,那么为保证事务的一致性,数据库操作失败,事务回滚,回到最初的正确状态

其中,事务的一致性决定了一个系统设计和实现的复杂度,导致了事务的不同隔离级别;在事务的并发的时候,隔离性设计的脏读、幻读等等。
想要了解更多更详细的,可以从下面的传送门去看下:
1.知乎上对事务四大特性理解
2.数据库事务和锁的面试文

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值