MYSQL为什么要有事务?或者说,事务是用来解决什么问题的?
MYSQL为什么要有事务?或者说,事务是用来解决什么问题的?
举一个最经典的样例:
假设进行银行转账,A的账户扣除50元,B的账户增加50元,对应的sql语句如下
update table set cost = cost - 50 where id = 'A';///step 1
update table set cost = cost + 50 where id = 'B';///step 2
这样就实现了一次银行转账,理论上是这样没错,但在现实生活中会出现很多问题,例如我执行了第一条语句后,突然电脑蓝屏了/死机了/断电了/电脑被人砸烂了.....
总之出现了各种各样的问题(被crash后),出现了一种情况:执行了第一条语句,但并没有执行第二条语句
当电脑恢复重启后,A发现他的账户少了,B的账户却没有变化,钱凭空消失了!
事务就是为了解决这一个问题——某些操作要么全部发生,要么全部不发生,不能发生一些,这就是数据库的第一个特性——原子性;
事务也被视作数据库的最小工作单位
好理解,由于原子性——即事务内的操作要么全部发生,要么全部不发生;所以事务被视作一个单位量。
这样的机制又衍生出了另一个问题:
当同一时间存在很多事务时,你不能确认哪些事务对数据的操作是正常的、正确的,即哪些事务不需要回滚。
有可能存在事务A读取了事务B更新后的数据,但事务B在更新后过了一段时间又进行了回滚,那么事务B之前的更新就不作数了
但是事务A并不知道事务B回滚了,依然拿了错误的数据在自己捣鼓,这样很显然有问题,有大问题!
所以事务与事务间需要隔离开来,防止有奇奇怪怪的东西混进来(?),这就是我们说的,事务需要——隔离性。
至于ACID剩下两个持久性和一致性
持久性即所有的数据需要持久化到磁盘,必须要持久啊!如果都存在内存里,我辛辛苦苦干一天,重启回到解放前,啥也没有,快乐白给。
另外:一致性,其实是原子性、隔离性、持久性的目的。
因为一致性的概念是:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。
回到开头,为什么要有事务?不就是为了解决钱莫名其妙不见了等等等等的问题吗?保证数据库的完整性才是我们使用事务的目的。
tips:数据库完整性:指的是数据库的正确性(指的是数据符合语义,反应实际状况)和相容性(指数据库同一对象在不同关系表中数据是符合逻辑的)
以上为本人手敲,估摸着参考了百度/知乎/CSDN/博客园等等等等的一堆文章,然后自己手写的,如有雷同,纯属巧合(耶)。
菜鸡一枚,如有错误敬请指正。