MySql транзакции с зависимыми запросами - PullRequest
0 голосов
/ 12 марта 2010

Я очень надеюсь, что вы можете помочь!

Я использую следующую функцию для отправки сообщения в моем приложении 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' может отправлять одно и то же сообщение нескольким '$ receient_id'.

Теперь проблема в том, что если последний запрос не удался, у меня есть строка в MAIL_MESSAGE без соответствующей строки в MAIL. Как я могу решить это?

Транзакции могут помочь, но я не знаю, как заставить это работать!

Заранее спасибо за помощь.

1 Ответ

1 голос
/ 12 марта 2010

Добавьте «начало» в начале последовательности, чтобы начать транзакцию. Зафиксируйте транзакцию, только если обе вставки успешно выполнены, в противном случае откат транзакции.

Я не знаю 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;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...