【问题标题】:Understanding Transactions in databases了解数据库中的事务
【发布时间】:2012-04-01 14:50:51
【问题描述】:

我是数据库应用程序的新手,我正在尝试使用 Datamapper 制作一个 ruby​​ Web 应用程序。

我偶然发现了这段我看不懂的代码:

transaction do |txn|
    link = Link.new(:identifier => custom)
    link.url = Url.create(:original => original)
    link.save   
end

我有几个问题:交易到底是什么?为什么这是首选而不是仅仅这样做:

link = Link.new(:identifier => custom)
link.url = Url.create(:original => original)
link.save   

什么时候应该考虑使用事务?什么是最好的用例?是否有任何在线资源可供我阅读有关此类概念的更多信息。

谢谢!

【问题讨论】:

    标签: database transactions datamapper


    【解决方案1】:

    事务是一个不可分割的工作单元。这个想法来自数据库世界,并与数据选择/更新问题有关。考虑以下情况:

    1. 用户 A 请求对象 O 以更改它。
    2. 当 A 做他/她的事情时,用户 B 要求相同的对象。对象 O 目前对两个用户都是平等的。
    3. 然后 A 将更新放入数据库,将属性 O1 更改为对象 O。用户 B 没有得到此更改 - 他的对象 O 仍与以前相同。
    4. B 将更改属性 O2 的数据库更新放到对象 O。对 O1 的更改实际上丢失了。

    基本上,它与多用户访问和更改有关 - 会出现多种问题。

    事务还用于将不同的操作耦合到一个逻辑处理语句中。例如,您需要删除用户及其所有关联的照片。

    一篇文章涵盖的主题非常广泛,因此我建议阅读以下文章:wiki#1wiki#2

    【讨论】:

    • +1 以获得很好的解释。如果使用事务,您能否澄清在相同情况下会发生什么?事务是否锁定了一行,因此用户 B 在事务进行时根本无法访问对象 O?我只是好奇...
    • 有很多实现,但基本上是的——行/表/数据库被锁定直到操作完成。实际上有几个级别的隔离 - en.wikipedia.org/wiki/Isolation_(database_systems)
    【解决方案2】:

    事务是一系列指令,在执行时被视为一条原子指令。

    这意味着所有指令必须成功才能使事务成功。如果其中只有一个失败,您将返回交易开始之前的状态。例如,这有利于容错。

    事务有用的另一个领域是并发应用程序。使用事务可以避免其他进程的干扰。

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2013-06-07
      • 1970-01-01
      • 2017-07-09
      • 1970-01-01
      • 2023-04-08
      • 2010-10-16
      • 1970-01-01
      • 2013-11-11
      • 2023-03-15
      相关资源
      最近更新 更多