0

我正在开发一个个人 PHP/MySQL 应用程序,我在我的项目中遇到了这个特殊场景:

我有各种评论线程。这由两个表处理 - “评论”和“线程”,“评论”表中的每个评论都有一个“thread_id”属性,指示评论属于哪个线程。当用户删除评论线程时,目前我正在执行两个单独的 DELETE SQL 查询:

  1. 首先删除“评论”表中属于该线程的所有评论
  2. 然后,从“线程”表中清除线程记录。

我还有另一种情况,我需要将表单中的数据插入两个单独的表中。

我应该在这种情况下使用交易吗?如果是这样,当我需要执行多个 SQL 查询时使用事务是否是一般的经验法则?

4

4 回答 4

1

这取决于您的实际需求,事务只是确保形成单个事务的所有数据操作成功执行并且事务顺序发生的一种方式(直到前一个事务成功或失败才能进行新事务)。如果其中一个查询由于某种原因失败,则整个事务将失败并恢复之前的状态。

如果您绝对需要确保除非事先删除所有评论,否则不会删除任何线程,请进行交易。如果您需要尽可能快的速度,请选择 MyISAM

于 2009-08-30T17:47:17.560 回答
0

是的,在执行多个相关操作时使用事务是一般的经验法则。如果您确实切换到 InnoDB(通常是一个好主意,但并非总是如此。我们没有真正讨论除事务之外的任何要求,所以我不会发表更多评论),我还建议对指向 Threads 的 Comments 设置约束因为听起来必须将评论分配给线程。然后删除线程将删除单个原子语句中的关联注释。

于 2009-08-30T17:47:06.640 回答
0

如果你想要 ACID 事务,你想要 InnoDB。如果一个 DELETE 成功而另一个失败意味着必须手动 DELETE 失败的尝试,我会说这是数据库更好地处理的困难。这些情况需要交易。

于 2009-08-30T17:47:59.977 回答
0

对于您问题的第一部分,我建议您在评论表中将 thread_id 声明为外键。这应该引用线程表的 id 列。然后,您可以设置“ON DELETE CASCADE”,这意味着当 ID 从线程表中删除时,所有引用该 ID 的注释也将被删除。

于 2009-08-30T17:49:48.660 回答