2012-04-01 50 views
1

我是数据库应用程序的新手,我试图使用Datamapper创建一个Ruby应用程序。了解数据库中的事务

我偶然发现这段代码,我不明白:

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 

当我应该考虑使用交易?什么是最好的用例?有没有可用的在线资源,我可以阅读有关这些概念的更多信息。

谢谢!

回答

3

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

  1. 用户A要求对象O以便更改它。
  2. 当A正在做他/她的东西时,用户B要求同一个对象。两个用户的对象O当前是相等的。
  3. 然后A将更新置于数据库中,并将属性O1更改为对象O.用户B没有得到此更改 - 他的对象O仍然与以前相同。
  4. B将具有已更改属性O2的数据库更新放入对象O.对O1的更改实际上已丢失。

基本上,它与多用户访问和更改有关 - 存在几种问题。

交易也用于将不同的操作组合到一个逻辑处理语句中。例如,您需要删除所有与他/她相关的照片的用户。

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

+0

+1有很好的解释。你能否澄清如果使用交易在同样的情况下会发生什么?事务是否锁定一行,以便在事务处理过程中用户B根本无法访问对象O?我只是好奇... – 2012-04-01 15:18:26

+0

有一些实现,但基本上是 - 行/表/数据库被锁定,直到操作完成。实际上有几个级别的隔离 - http://en.wikipedia.org/wiki/Isolation_(database_systems) – 2012-04-01 15:20:33

+0

谢谢你,阅读你的维基链接和学习... – 2012-04-01 15:29:19

1

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

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

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

希望这会有所帮助。