数据库事务ACID特性分析

 

在日常生活中,事务是无时无刻不存在的,什么是事务,按我的理解事务便是执行一段连续的不可分离的操作,这段操作是为了实现某一个目的而执行的,它不存在中间状态,要么执行成功,则该操作所带来的影响永久存在,要么执行不成功,则撤销所进行的所有操作带来的所有影响,将一切事物恢复到操作前的状态。这种事务功能看似没什么用,但是却是有存在的必要,举一个很经典的例子,我们去银行进行转账的时候,其操作流程是存款、转到对应的账户上,假如在这一连串的操作中,虽然存款操作成功了,但是转到对应账户的操作失败了,如果这样放任不管,也就是使其有中间状态,那么这样便意味着用户虽然存款成功了,但其存款的目的转账却失败了,用户将永久的失去这一存款金额,这种操作放在现实中是恐怖的,这样用户每次转账都是在赌运气,运气好的就转成功,运气差一点的话,可能是在存款环节失败没法存款,最差就是转到账户失败,银行自动吞掉存款金额。这样的赌运气操作估计没有任何用户愿意参与的。所以事务的存在是很有必要的,在数据库中便普遍支持事务这一操作,例如MySQL或者Oracle等数据库都允许事务的存在,在事务的实现中,普遍遵循ACID理论,什么是ACID理论,即事务需要遵循的四种特性,分别是原子性、一致性、隔离性、持久性。

原子性是指事务这一连续操作的集合,要么全部执行成功,要么全部执行不成功,不存在只执行操作集合中的部分操作,即跟上面举的银行转账例子一样,不存在只执行存款操作而不执行转账功能。

一致性是指事务带来的影响往往是固定的,即只要执行了这一操作,其影响都是固定的,例如在数据库的事务中更新某条数据后,当事务执行完,便能看到清晰看到改动数据的最新值,而不会看到改动前的旧值,而当事务执行失败的时候,我们所看到的的值就依旧是旧值而不是在事务中更新后的值。这便是一致性,事务的操作会使数据从旧的一致性切换到新的一致性。

持久性是指事务对数据库的改动的永久性,若事务执行成功,其改动的数据在下次被修改前都是永久存在的,当我们数据库发生故障,散失了这个改动也可以通过事务日志来重新恢复改动。

隔离性是指多个事务同时执行的时候,互相不进行干扰,在MySQL中为了保障事务的互不干扰,设立了四种级别,分别是未授权读、授权读、可重复读、串行执行。其中未授权读的是指当一个事务A在对某一个数据进行连续的改动时候,另一个事务B可以观察到数据的变化,即另一个事务可以看到了事务A的状态,这样事务B很容易出现脏读的现象,其所读取到的数据是过时数据,若其使用,必定会出现结果错误,这也是隔离级别最差的一级。第二个级别是授权读取即不允许事务B能观察到事务A的中间状态,它能观察到要么是事务A执行前数据的值,要么是事务A执行后的数据的值,但也存在不可重复读的问题,即事务A的操作中需要访问两次数据dataA,当第一次访问完数据dataA后,dataA的数据被另一个事务修改了,当第二次访问dataA的时候会发现数据已经产生变化了,这便是不可重复读问题。第三个级别是可重复读,即当事务A操作时要对dataA进行读取,会对dataA进行锁定,不允许其他事务对dataA进行修改,解决了不可重复读的问题,但依旧存在幻影读的问题,幻影读按我的理解说其实发生的场景就是当我们在事务A中进行查找表中所有的数据的时候,第一次查找的时候表tableA中的数据是100条,在查找完的时候,刚好另一个事务对tableA进行Insert操作,所以事务A进行第二次查找的时候表tableA的数据便成了101条,多了一条的数据就像幻影一样,突然出现,所以被称为幻影读问题,需要注意的是可重复读和幻影读它们对事务A的影响所对应的操作是不一样的,可重复读是因为另一个事务update某条数据所带来的数据不一致问题,所以进行的解决方法便是锁定要被update的那条数据,不然其他事务对那条数据进行更改,而幻影读是因为另一个事务要要对事务A所涉及的表进行Insert或delete操作,插入或删除某条数据,其解决方法只能是锁定整个表,不让其他事务能对该表进行任何操作,从锁方法来看锁整个表的范围明显大于锁某条数据,所以其消耗的性能将会更多。最后一个级别便是串行化事务,即数据库在任何一个时刻只允许至多一个事务的执行,这种隔离级别是最高的,可以确保任何一个事务在执行的过程中不会被任何一个事务所影响,但其所带来的性能消耗也是最大的,一般很少使用。一般情况下是会选择隔离性的第二个等级即授权读取,实现该级别所需要消耗的性能还可以接受,同时其可以有效避免了脏读的问题。

   数据库通过ACID这四个特性保证了事务的正确执行,在接下来的文章里,我会从数据库事务过度到分布式事务,从本地事务的ACID特性转换成CAP和BASE理论

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值