我应该使用InnoDB吗?

时间:2009-08-30 17:38:09

标签: sql mysql transactions innodb

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

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

  1. 首先删除“评论”表中所有属于该帖子的评论
  2. 然后,从'Threads'表中清除线程记录。
  3. 我还有另一种情况,我需要将表单中的数据插入两个单独的表中。

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

4 个答案:

答案 0 :(得分:1)

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

如果您确实要确保除非事先已删除所有注释,否则不会删除任何线程,请进行交易。如果您需要所有速度,请转到MyISAM

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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