Transactions 在现有代码中,我找到了一个非&x27;如果我没有卷入交易,我应该恐慌吗?

Transactions 在现有代码中,我找到了一个非&x27;如果我没有卷入交易,我应该恐慌吗?,transactions,currency,Transactions,Currency,在我正在使用的现有代码中,我发现资金转移过程没有包含在事务中,它是完全不可接受的还是可以,因为有所有需要的健全性检查,即要转移的资金量大于零,以及ORM级别的验证余额大于或等于零 首先,我之所以对它感到如此困惑,是因为它来自于一个可靠的开发人员,而且它是一段按书编写的代码,在没有事务的情况下看到这样的东西是很奇怪的: self.balance -= amount save! target.balance += amount target.save! A除其他外,解决两类问题: 它提供了防

在我正在使用的现有代码中,我发现资金转移过程没有包含在事务中,它是完全不可接受的还是可以,因为有所有需要的健全性检查,即要转移的资金量大于零,以及ORM级别的验证余额大于或等于零

首先,我之所以对它感到如此困惑,是因为它来自于一个可靠的开发人员,而且它是一段按书编写的代码,在没有事务的情况下看到这样的东西是很奇怪的:

self.balance   -= amount
save!

target.balance += amount
target.save!
A除其他外,解决两类问题:

  • 它提供了防止并发访问的保护
  • 它提供了一种回滚机制

  • 我看不出任何检查会如何替换这两个…

    如果没有看到任何代码,我会有根据地猜测现有代码是不可接受的。即使进行了健全性检查,如果在“转账”过程中的对账单之间从该账户提款,您的代码中也会有一个种族条件,这将导致不存在的资金转账。当然,当有许多并发用户时,发生这种情况的可能性更大。

    请确保您必须尽快修复它。事务是一个逻辑工作单元,可以包括任意数量的文件或数据库操作。只有事务才能确保一切正常或不正常,并使您无法从不一致的意外状态恢复日志

    让我向您展示一下为什么使用一些伪代码会造成这种情况

    两次转账:

    #1: How much money does George have? $1500, that is fine.
    #1: Send $1000 to Martha.
    #1: Take $1000 from George.
    
    #2: How much money does George have? $500, this is not enough.  Give up!
    #2: Do not send $1000 to Martha.
    #2: Do not take $1000 from George.
    
    实际发生的情况:

    #1: How much money does George have? $1500, that is fine.
    #2: How much money does George have? $1500, that is fine.
    #1: Send $1000 to Martha.
    #2: Send $1000 to Martha.
    #1: Take $1000 from George.
    #2: Take $1000 from George.
    
    乔治成功地把他没有的钱转帐了


    您的数据库获得的流量越多,这种冲突发生的可能性就越大。

    谢谢您的小时间开发人员!我发现,即使是有经验的开发人员也不理解或欣赏数据库方面的东西,包括一些令人讨厌的细节,比如避免竞争条件。或者,他们发誓“以后再来”……我同意加勒特的观点。通常,“类似存根”或“原型”的代码会直接进入生产应用程序,因为它还没有损坏。但它也没有真正经过任何审查。但是在你对上级说原作者的坏话之前,你应该先联系编码员,看看他/她是否有解释。大多数程序员最终会说“哇!谢谢你接电话但是,他们中的一些人是混蛋,所以要小心。“在你对上级说原著作者的坏话之前”——你对我的想法很了解。实际上,我想把这个问题也标记为“道德”问题(不幸的是,没有这样的标记),因为“上级”似乎认为代码库是安全的和高质量的:)至于现在,我想我只需要修复它,然后闭嘴:)也要小心。如果它不能很好地工作(添加事务性支持可能会有一些bug),那么您将被指责破坏了有效的代码,而不是因为修复了前任留给您的定时炸弹而受到表扬。祝你好运我们都支持你!