mysql 事务 表 锁定_MySQL:事务与锁定表

小编典典

锁定表可防止其他数据库用户影响您锁定的行/表。但是锁本身并不能确保您的逻辑以一致的状态出现。

想想一个银行系统。当您在线支付账单时,至少有两个受交易影响的帐户:您的帐户,从中提取资金。以及收款人的帐户,资金将汇入该帐户。还有银行的帐户,他们将愉快地存入交易中收取的所有服务费。鉴于(众所周知,这些天,人们)银行异常愚蠢,可以说他们的系统是这样的:

$balance = "GET BALANCE FROM your ACCOUNT";

if ($balance < $amount_being_paid) {

charge_huge_overdraft_fees();

}

$balance = $balance - $amount_being paid;

UPDATE your ACCOUNT SET BALANCE = $balance;

$balance = "GET BALANCE FROM receiver ACCOUNT"

charge_insane_transaction_fee();

$balance = $balance + $amount_being_paid

UPDATE receiver ACCOUNT SET BALANCE = $balance

现在,由于没有锁也没有交易,该系统容易受到各种竞争条件的影响,最大的竞争条件是对您的帐户或接收方帐户并行执行多次付款。虽然您的代码已取回余额并正在执行huge_overdraft_fees()之类的操作,但其他付款完全有可能并行运行相同类型的代码。他们将取回您的余额(例如100美元),进行交易(取出您要支付的20美元,以及他们给您带来的30美元),现在这两个代码路径都有两个不同的余额:80美元和70美元。取决于最后完成的余额,您最终将在帐户中获得这两个余额中的任意一个,而不是应该以($

100-$ 20-$ 30)结尾的$ 50。在这种情况下,“银行错误对您有利”

现在,假设您使用锁。您的帐单付款($ 20)首先达到目标,因此它赢了并锁定了您的帐户记录。现在您已经拥有了专用权,可以从余额中扣除$

20,然后将新的余额放回原位…您的帐户最终会得到$

80的收益。但是…呃…您尝试去更新收款人的帐户,并且该帐户已被锁定,并且锁定的时间超出了代码允许的范围,导致您的交易超时…我们正在处理愚蠢的银行,因此没有适当的错误处理时,代码只需拉一个exit(),您的20美元就消失了。现在您只剩20美元了,还欠接收者20美元,您的电话就被收回了。

所以…输入交易。您开始交易,从您的帐户中扣款$ 20,然后尝试向收款人借入$ 20

…然后又发生了爆破。但这一次,exit()代码不是可以执行,而是rollback欺骗性地将您的$ 20神奇地加回到您的帐户中。

最后,归结为:

锁可以防止其他人干扰您正在处理的任何数据库记录。事务可防止任何“较晚”的错误干扰您所做的“较早”的事情。谁也不能保证最后一切都会好起来。但是他们在一起。

在明天的课程中:僵局的喜悦。

2020-05-17

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值