个人对数据库事务ACID的通俗理解

下面这些是个人理解,如果有不对的地方劳烦各位批评指正。
我们先不说事务的特性,说说为什么要事务,还有为什么规定它有这些特性。
对数据库做一件事,必须保证数据库的一致性,什么叫数据库的一致性,就是说在做这件事之前或者之后,数据库中的数据一定符合逻辑,符合逻辑就叫一致,不符合就叫不一致。这件事不是一步就做完的,最经典的例子:转账(a给b转100),先说步骤,分六步,一、从数据库取出a的值,二、给这个值-100,三、把更新完的值写回数据库里的a,四、取出b的值,五、给这个值+100,六、把更新完的值写回数据库里的b;再说怎么会导致不一致,第一种情况,写业务逻辑的时候,先给a减去100,再给b增加50,这是因为业务逻辑写错了导致的数据库里的数据不符合逻辑(不一致),第二种情况,业务逻辑没写错,a-100,b+100,执行的时候,第一二三步a-100,后面因为某种原因没执行,比如停电,这是因为系统或数据库本身故障或错误导致数据库里的数据不符合逻辑(不一致);第三种情况,在执行这六步的过程中,数据库执行完一二步后,又来了一个新的语句,由于某种原因(可能优先级高),数据库先去执行了新来的语句,新来的语句是给a+100,这个新语句执行完了,又去执行上面的第三步,这时候给a写进去的值就是a-100,导致a数据不符合逻辑了(不一致),这个是因为并发导致的。所以在做一件事的时候,要对这件事的这些步骤的执行做一些规定,来防止上面的情况出现,或者在上面情况出现的时候有恢复的手段。这种有好几步才做完的事我们给他起个名儿,就叫事务,以后每一件我们要做的事,都叫一个事务。事务就是一个名儿,让我们能称呼他,重点还是这件事,我们怎么规定它的这些步骤,也就是我们怎么规定事务的这些步骤,让他在执行的时候得到符合逻辑(一致)的结果。其实让数据库中的数据不不符合逻辑(不一致)的最大原因还是第三种情况,并发。
现在该说说我们对事务的执行有哪些要求了,我们先说要求,不说它怎么实现。一、针对第一、二种情况,我们说一定要保证事务的所有步骤都执行完,或者说让他都不执行,也就是原子性,不能执行一半就完了。二、针对第三种情况,我们说一定要让这好几个事务在执行的时候互相之间没有影响,也就是不能这个改一半另一个又改,然后这个回来又改,这个就叫隔离性
上面这两个对事务的规定都是为了我们前面说的符合逻辑(一致),这就是说让事务对数据库的操作都应该使数据库中的数据保持符合逻辑这一特性,也就是一致性,这个一致性是说让数据库保持一致性,不是说事务本身有一致性。前两个性质,我们都说的是事务本身具有这种特性,而一致性是事务的操作结果对于数据库中的数据而言的。
还有就是,我们在做一件事的时候都是先把这件事在内存里做一遍,再把结果写到实际的数据库里去,如果我们在内存写完了,突然停电了,这个时候,事做完了,但没写进数据库,数据库里的数据没改,这个就可能引发后面的某些错误,所以要让事务有持久性,也就是做完了就是做完了,就算突然停电了,再启动数据库的时候,我们通过某些方法让他来到做完的这个状态。
以上就是事务的四个特性,A(原子性)C(一致性)I(隔离性)D(持久性)。具体做法就是并发控制和日志恢复。
并发控制和日志恢复的文章大家可以自行搜索。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值