我正在开发一个应用程序,用户可以提交帖子,其他人可以回复该帖子。当用户发布帖子时,他可以选择哪些用户可以查看该帖子。
这是帖子表:
这是“posts-visible”表格。它表示帖子和成员之间的个体关系(这意味着他们可以查看和回复帖子):
这是回复表格:
现在,当有人添加回复时,我会在一个事务中运行以下操作:
我的问题是:是否需要使用
第二个问题是,我还有一些关于帖子信息(例如帖子内容、标题等)的代码。 代码类似,除了没有INSERT之外,第一个SELECT之后还有另一个SELECT来检查访问权限。既然没有写入任何东西,那么是否需要事务? 这与第一个答案有何不同?
最后一个问题。如果我有一个事务,在插入之前检查行是否存在,那么事务是否会防止另一个事务在行检查和插入之间插入一行?
谢谢!
这是帖子表:
| id | poster-id | title | message | ... |
这是“posts-visible”表格。它表示帖子和成员之间的个体关系(这意味着他们可以查看和回复帖子):
| id | post-id | user-id |
这是回复表格:
| id | posts-id | poster-id | title | message | ... |
现在,当有人添加回复时,我会在一个事务中运行以下操作:
try
{
$db->beginTransaction();
// first check if the user is part of the posts-visible group
$stmt = $db->prepare('SELECT id FROM `posts-visible` WHERE posts-id=:pid AND poster-id=:uid LOCK IN SHARE MODE');
// ... bind and execute
if($stmt->rowCount() <= 0) return false; // not in visible group
$stmt = $db->prepare('INSERT INTO `replies` ... ');
// binds and execute
$db->commit();
}
catch(Exception $e)
{
$db->rollback();
}
我的问题是:是否需要使用
LOCK IN SHARE MODE
? 我设想了可能出现的竞争条件,即原始发布者在用户发布回复时删除了对该帖子的访问权限,在这种情况下,尽管发布者禁止他访问,但他仍然可以发布回复,因此我使用了LOCK IN SHARE MODE
,以便其他会话可以读取但不能修改它。 然而,事务不已经通过ACID中的隔离保证了同步访问,以防止发生这种情况吗? 如果是这样,那么什么情况下会使用LOCK IN SHARE MODE
? 为什么在事务中使用它?第二个问题是,我还有一些关于帖子信息(例如帖子内容、标题等)的代码。 代码类似,除了没有INSERT之外,第一个SELECT之后还有另一个SELECT来检查访问权限。既然没有写入任何东西,那么是否需要事务? 这与第一个答案有何不同?
最后一个问题。如果我有一个事务,在插入之前检查行是否存在,那么事务是否会防止另一个事务在行检查和插入之间插入一行?
谢谢!
posts-visible.id
。 - zerkms