【问题标题】:symfony2 doctrine 2 : in which cases do we need to lock a database table/row?symfony2 原则 2:在哪些情况下我们需要锁定数据库表/行?
【发布时间】:2015-01-27 12:08:10
【问题描述】:

我发现了一篇关于锁定的学说文章:http://doctrine-orm.readthedocs.org/en/latest/reference/transactions-and-concurrency.html?highlight=locking#locking-support

我了解在某些涉及多个请求的情况下,需要锁定表。

我不清楚我们什么时候需要这样做。有人可以提供我们绝对需要的基本用例吗?或者更准确地定义什么是我们需要做的案例?

例如,假设用户 1 访问一个实体修改页面,用户 2 在 user1 之后访问它。如果 user1 提交了更改请求,并且在 user1 提交之前已经加载数据的 user2 现在在 user2 更新实体后按下更新按钮,我们需要锁定表吗?

【问题讨论】:

    标签: mysql symfony doctrine-orm transactions locking


    【解决方案1】:

    在基于 Web 的应用程序中很少需要显式锁定数据库表/行,应该避免。等待请求时切勿锁定任何内容。

    考虑如果用户 1 签出一个实体、锁定表/行然后去吃午饭会发生什么。现在您的数据库可能会被锁定一个小时或更长时间,这让其他用户感到沮丧。午餐后,您的用户会被公共汽车碾过。哎呀。

    Doctrine 2 有几种内置的并发方法:http://doctrine-orm.readthedocs.org/en/latest/reference/transactions-and-concurrency.html#locking-support。仔细阅读并了解哪种方法最适合您的情况。

    一般来说,您会希望使用乐观锁定,它假定多个用户同时更新同一记录是相当罕见的事件。第一个更新的用户获胜。版本控制用于防止后续用户覆盖第一个用户所做的更改。其他用户将不得不重做他们的更改,但这比输入不正确的数据要好。

    【讨论】:

    • 我确实喜欢总线场景 ;) 因此,如果我根本不使用乐观锁定,最后一个更新实体的用户将获胜。我可以忍受。这会是坏事/会导致数据完整性问题吗?
    • 让最后一个用户更新 win 会非常糟糕,因为他们会根据旧信息进行更新。您希望第一个更新的人获胜。
    • 好的。你会有一个使用乐观锁定的symfony简单案例吗?我有点理解我必须添加一个版本字段并检查该版本号以查看我是否仍然拥有正确的实体。是不是有点重?
    • 按照手册中的示例进行操作。您只需向您的实体添加一个 @Version 属性。教义完成了其余的工作。您永远不需要检查代码中的版本。如果您尝试更新错误的版本,Doctrine 将抛出异常。我怀疑你是否能找到更轻松的方法。
    • 好的,很好,我想我们必须检查版本。很高兴知道教义做到了。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2012-02-10
    • 1970-01-01
    • 2021-11-16
    • 1970-01-01
    • 2011-07-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多