【问题标题】:Where should I handle concurrent operations on the same data? In the application or the database?我应该在哪里处理相同数据的并发操作?在应用程序或数据库中?
【发布时间】:2011-05-04 21:36:28
【问题描述】:

所以我正在使用 Spring 和 Hibernate 构建一个 Java webapp。在应用程序中,userw 可以向对象添加点,我想计算点数以订购我的对象。对象也存储在数据库中。并且希望成百上千的人同时给这些物品打分。

但是我如何计算积分并同时将它们保存在数据库中?通常我只会在我的对象上有一个属性,然后增加分数。但这意味着我必须使用悲观事务锁定数据库中的数据,以防止并发问题(在另一个线程已经完成更改的一半时读取点的数量)。这可能会使我的应用程序变得更慢(至少我认为会这样)。

另一种解决方案是将给定点的数量存储在关联对象中,并将它们分别存储在数据库中,同时在“小”同步块或其他东西中计算内存中的点。

在处理同一对象上的许多并发操作时,哪种解决方案对性能的影响最小。或者有没有其他合适的解决方案?

【问题讨论】:

    标签: database concurrency transactions synchronization


    【解决方案1】:

    如果您希望这些值被持久化,那么您应该将它们持久化到您的数据库中。

    鉴于此,请尝试以下操作:

    1. 创建一个非常窄的行,例如 OBJ_ID 和 POINTS。
    2. 仅在 OBJ_ID 上创建索引,因此在插入、更新或删除值时不会花费大量时间来更新索引。
    3. 使用INNODB,它有行级锁,所以锁会更小
    4. mysql 会给你最后提交的(一致的)值

    这一切都很简单。试一试!设置一个模拟您预期负载的测试用例并查看它的执行情况。如果遇到困难,请回帖。

    祝你好运。

    【讨论】:

    • 好吧,这听起来很合理,但你说 mysql 会给我最后提交的值。如果两个请求同时读取该值并尝试将新值写入数据库会发生什么?最后一个写入会出错,还是事务会阻止第二个请求继续执行,直到第一个请求完成?
    • 启动事务,读取值,写入增量值,提交事务。一切安全。
    猜你喜欢
    • 2011-02-15
    • 2018-05-26
    • 2023-03-06
    • 1970-01-01
    • 2014-11-08
    • 1970-01-01
    • 2015-02-09
    • 2015-05-10
    • 1970-01-01
    相关资源
    最近更新 更多