English 中文(简体)
根据实体属性同时更新实体
原标题:Concurrently updating entity depending entity attribute
  • 时间:2012-05-25 15:33:09
  •  标签:
  • mysql
  • jpa

我创建了一个实体用户,它有整数属性交易配额。 我需要根据交易配额的价值更新交易配额。

如果大于0,则需要减少,否则其价值需要保留。

这是我的算法

  1. Retrive user entity from database.
  2. Check transaction quota, if transaction quota greater than 0, reduce it by one.
  3. Persist the changed user entity.

In above case, when concurrent request comes if two thread retrieves same user entity and then both threads read same transaction quota value and if it is greater than 0 then both reduces by 1 and updates the user entity.

ex. 前 ex

ThreadA: val = e.getTxnQuota(); val = 5
ThreadB: val = e.getTxnQuota(); val = 5
ThreadA: e.setTxnQuota(val- 1); val = 4 
ThreadB: e.setTxnQuota(val- 1); val =4
ThreadA: eDao.save(e);
ThreadB: eDao.save(e);

在以上情况下,节省的价值是4,而不是3。

那么,我是否有什么办法可以创造出一种原子交易,我可以在其中检查交易配额并更新用户实体?

最佳回答

这被称为“ em> locking optimatic

@Version
private long version;

好样的!

每次保存用户时, 其当前版本将与数据库中的版本比较, 并加增 :

update user set ..., version = version + 1 where id = ... and version = theVersionOfTheUserWhenItWasLoaded

(这一切都以透明方式发生)。

如果版本不匹配, 那么没有更新, JPA 引擎检测它, 抛出一个最佳列表例外, 并标记交易回滚 。

副注释 : 在您上面的假想中, 调用 < code> save () 是不必要 : 对附属实体的所有更改都自动保存在数据库中。 不需要保存该实体 。

问题回答

暂无回答




相关问题
SQL SubQuery getting particular column

I noticed that there were some threads with similar questions, and I did look through them but did not really get a convincing answer. Here s my question: The subquery below returns a Table with 3 ...

please can anyone check this while loop and if condition

<?php $con=mysql_connect("localhost","mts","mts"); if(!con) { die( unable to connect . mysql_error()); } mysql_select_db("mts",$con); /* date_default_timezone_set ("Asia/Calcutta"); $date = ...

php return a specific row from query

Is it possible in php to return a specific row of data from a mysql query? None of the fetch statements that I ve found return a 2 dimensional array to access specific rows. I want to be able to ...

Character Encodings in PHP and MySQL

Our website was developed with a meta tag set to... <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> This works fine for M-dashes and special quotes, etc. However, I ...

Pagination Strategies for Complex (slow) Datasets

What are some of the strategies being used for pagination of data sets that involve complex queries? count(*) takes ~1.5 sec so we don t want to hit the DB for every page view. Currently there are ~...

Averaging a total in mySQL

My table looks like person_id | car_id | miles ------------------------------ 1 | 1 | 100 1 | 2 | 200 2 | 3 | 1000 2 | 4 | 500 I need to ...

热门标签