FD日包原理–个人见解

举转账那个例子吧!

假设你的账号上有 1000 元,你转账给朋友 100 元,然后又向账号汇入 100 元,请问你的账号上余额是多少?是不是太简单了,小学生都会算,当然还是 1000 元,对吧。 整个流程如下:

查看账号余额为 1000 元
转账给朋友 100 元,账号余额为 900 元
再查看账号余额为 900 元
汇入100 元到账号,账号余额为 1000 元
现在,假设你向朋友的转账和汇款是同时(并发)进行的,整个流程可能如下:

查看账号余额为 1000 元(转账查看)
查看账号余额为 1000 元(汇款查看)
转账给朋友 100 元,账号余额为 900 元
汇入100 元到账号,账号余额为 1100 元
那么,结果是现在账号余额居然是 1100 元。显然,正确的结果应该是 1000 元,呵呵,这就是数据库访问的并发性问题。

其实,数据库访问的并发性问题有很多种情况,以上这种情况只是其中的一种叫更新丢失。

更新丢失
如果多个事务同时(并发)对数据库表中的同一条记录进行修改,那么后修改的记录将会覆盖前面修改的记录,前面的修改就丢失掉了,这就叫做更新丢失。如下图:

说白了,由于你请求的过快,然后每次请求都会先读取数据库的数据,你读取时前面的业务逻辑还没处理完,数据库还没更新,直到第一个请求数据处理完时,数据库发生改变,只要是第一次请求处理后的同样请求都会失败,第一次请求到第一次处理完期间的请求都会成功(这个期间请求数据库的数据返回的都是一样的,查询余额永远为1000元),,,这就是为什么r包 有一部分成功的原因,如果还不理解多读读上面的文字。

小青年资源网
小青年技术网 » FD日包原理–个人见解