MySql与依赖查询的转换

时间:2010-03-12 14:46:45

标签: mysql transactions

我真的希望你能帮忙!

我使用以下函数在我的PHP / MySql应用程序中发送消息:

public function sendMail($sender_id, $recipient_id, $subject, $message) {
        $q = "INSERT INTO MAIL_MESSAGE (subject, message, date) VALUES ('$subject', '$message', NOW() )";
        $s = mysql_query($q);
        if (mysql_affected_rows()==1) {
            $message_id = mysql_insert_id();    
            $q = "INSERT INTO MAIL (user_id, sender, message_id) VALUES ('$recipient_id','$sender_id','$message_id')";
            $s = mysql_query($q);
            if (mysql_affected_rows()==1)
                return true;
        }
        return false;
    }

我使用两个表(MAIL_MESSAGE和MAIL),因为'$ sender_id'可以向多个'$ recipient_id'发送相同的消息。

现在问题是,如果最后一个查询失败,我在MAIL_MESSAGE中有一行没有MAIL中的对应行。 我该如何解决这个问题?

交易可以提供帮助,但我不知道如何让它发挥作用!

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

在序列开头添加“begin”以启动事务。仅在两个插入成功时提交事务,否则回滚事务。

我不了解PHP,但根据您的示例,它看起来如下所示:

public function sendMail($sender_id, $recipient_id, $subject, $message) {
        $s = mysql_query("begin");
        $q = "INSERT INTO MAIL_MESSAGE (subject, message, date) VALUES ('$subject', '$message', NOW() )";
        $s = mysql_query($q);
        if (mysql_affected_rows()==1) {
            $message_id = mysql_insert_id();    
            $q = "INSERT INTO MAIL (user_id, sender, message_id) VALUES ('$recipient_id','$sender_id','$message_id')";
            $s = mysql_query($q);
            if (mysql_affected_rows()==1) {
                $s = mysql_query("commit");
                return true;
        }
        $s = mysql_query( "rollback" );
        return false;
    }