Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 我应该在哪里处理相同数据上的并发操作?在应用程序中还是在数据库中?_Database_Concurrency_Transactions_Synchronization - Fatal编程技术网

Database 我应该在哪里处理相同数据上的并发操作?在应用程序中还是在数据库中?

Database 我应该在哪里处理相同数据上的并发操作?在应用程序中还是在数据库中?,database,concurrency,transactions,synchronization,Database,Concurrency,Transactions,Synchronization,所以我正在用Spring和Hibernate构建一个JavaWebApp。在应用程序中,userw可以向对象添加点,我想计算为排序对象而给定的点。这些对象也存储在数据库中。希望数以百计的人能同时给这些物体打分 但是我如何计算这些点并同时将它们保存在数据库中呢?通常我会在我的对象上有一个属性,然后增加点。但这意味着我必须用悲观事务锁定数据库中的数据,以防止并发问题(当另一个线程已经更改了一半时读取点数)。这可能会使我的应用程序慢得多(至少我认为会) 另一种解决方案是将给定点的数量存储在关联对象中,

所以我正在用Spring和Hibernate构建一个JavaWebApp。在应用程序中,userw可以向对象添加点,我想计算为排序对象而给定的点。这些对象也存储在数据库中。希望数以百计的人能同时给这些物体打分

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

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


在处理相同对象上的多个并发操作时,哪个解决方案对性能的影响最小。或者是否有其他拟合解决方案?

如果希望保留这些值,则应将其保留在数据库中

鉴于此,请尝试以下方法:

  • 创建一个非常窄的行,就像OBJ_ID和点一样
  • 仅在OBJ_ID上创建索引,因此在插入、更新或删除值时不会花费大量时间更新索引
  • 使用INNODB,它具有行级锁,因此锁会更小
  • mysql将为您提供最后提交的(一致的)值
  • 这很简单。转一转!设置一个模拟预期负载的测试用例,并查看其执行情况。如果你被卡住了,回邮


    祝你好运。

    好的,听起来很合理,但你说mysql会给我最后一次提交的值。如果两个请求同时读取此值并尝试向数据库写入新值,会发生什么情况?最后一个写入的请求是否会出错,或者事务是否会阻止第二个请求继续执行,直到第一个请求完成?启动事务,读取值,写入增量值,提交事务。一切安全。