作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
场景:
我正在 Symfony2 中实现一个应用程序,每五分钟运行一次命令(cronjob),该命令遍历 MySql 表并在每条记录中,首先读取 json_array 字段,执行一系列计算,最后将包含新数据的数组保存在同一个领域。此外,还有一个 Web 应用程序,用户可以在同一个表中编辑和保存这些数据
为了避免并发,如果命令访问记录,我会创建一个悲观锁,这样,如果用户在那一刻更改数据,则必须等到事务结束,并且当它完成时,用户数据将被删除。已保存。
但是当用户保存数据时,随机出现一个错误,用户数据没有保存,并且Web应用程序显示以前的数据,这告诉我锁定不成功。
我在 symfony2 命令中进行悲观锁定的代码:
foreach ($this->cisOfferMetaData as $oldCisOfferMeta) {
// calculate budget used for each timeframe case and save it
// begin transaction and Lock cisOfferMEta Entity
$this->em->getConnection()->beginTransaction();
try {
$cisOfferMeta = $this->em->getRepository('CroboCisBundle:CisOfferMeta')->find(
$oldCisOfferMeta->getId(),
LockMode::PESSIMISTIC_READ
);
$budget = $cisOfferMeta->getBudgetOffer();
foreach (
generator(CisOfferMeta::getTypesArray(), CisOfferMeta::getTimeframesArray())
as $type => $timeframe
) {
if (isset($budget[$type][$timeframe]['goal'])) {
// if type=budget we need revenue value, if type=conversion, conversions value
$budget[$type][$timeframe]['used'] =
($type === 'conversion')
? intval($allTimeframes[$key]['conversions'][$timeframe])
: round($allTimeframes[$key]['revenue'][$timeframe], 2);
$budget[$type][$timeframe]['percent_reached'] =
($budget[$type][$timeframe]['used'] == 0.0)
? 0.0
: round(
$budget[$type][$timeframe]['used'] / intval($budget[$type][$timeframe]['goal']) * 100,
2
);
}
}
$budget['current_conversions'] = $allTimeframes[$key]['conversions'];
$budget['current_revenue'] = $allTimeframes[$key]['revenue'];
$cisOfferMeta->setBudgetOffer($budget);
$this->em->flush($cisOfferMeta);
$this->em->getConnection()->commit();
} catch (PessimisticLockException $e) {
$this->em->getConnection()->rollback();
throw $e;
}
}
我做错了什么吗?我想由于事务是在提交更改之前启动的,因此如果用户尝试读取或更新数据,则必须等到锁定从被阻止的实体中释放。
阅读 Doctrine 文档并不清楚我是否应该在实体中添加版本控制
最佳答案
最后这段代码工作正常并实现了悲观锁,问题出在监听器中,该监听器在此锁之前读取数据,然后在锁释放后刷新而不进行任何更改。
关于php - 教义悲观锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28310623/
我正在编写一个 Web 应用程序,两个不同的用户可以在其中更新事物列表,例如待办事项列表。我已经意识到,乐观锁定机制效果最好,因为我不希望出现高争用情况。 我一直在查看事务隔离级别,现在我有点困惑。看
我是一名优秀的程序员,十分优秀!