如果用户-a在访问用户a的数据时手动更新他的某些信息,我该如何确保访问该信息的用户-b获取正确的更新信息而不是用户的旧陈旧数据 - 一个。
我理解事务很好并且行级锁定,我只是想确保我做得正确!
更新我正在使用的用户信息时,
$dbc -> beginTransaction();
$dbc -> query("SELECT id FROM accounts WHERE id = " . $user['id'] . " FOR UPDATE LIMIT 1");
$q = $dbc -> prepare("UPDATE accounts SET name = ?");
$q -> execute(array($_POST['name']));
$dbc -> commit();
使用上面的方法可以锁定用户的数据,这样当用户-b获取用户使用的数据时,
$q = $dbc -> ("SELECT * FROM accounts WHERE id = ?");
$q -> execute(array($_GET['id']));
他会得到正确的更新数据吗?或者在获取user-b的用户数据时需要使用事务吗?
我对所有这些锁定和东西感到有点困惑,你可能会告诉你什么?!?
由于
答案 0 :(得分:0)
要处理网站中的并发性,客户端与客户端之间存在断开连接。数据库,通常的做法是在每条记录上都有一个列,允许您检查它自上次获取后是否已更新。
无论是最后更新日期列还是(我的偏好)自动增量版本号(通过触发器实现),您只需要在WHERE
子句中检查您所获得的值与记录中的值匹配例如:
UPDATE accounts SET name = ?, lastupdate=sysdate WHERE id = ? AND lastupdate = ?
如果lastupdate值不匹配,因此您无法更新记录,您可以假设其他人已更新数据并相应地处理异常。
这适用于难以进行重叠更新的系统。
我更喜欢使用触发器,因为并发值是为您维护的。 (唯一的缺点是,如果要重新更新相同的记录,则必须重新查询数据,直到mysql实现RETURNING子句为止)
请参阅:Handling the concurrent request while persisting in oracle database?