2015-10-04 2 views
0

У меня есть некоторые сомнения в транзакциях mysql. Мне нужно создать две записи в двух разных таблицах одновременно, и если одна из вставок не удалась, другая не должна быть сохранена. Вот мой код:Устранение сомнительных транзакций Php mysql

$conn->autocommit(FALSE); 
$conn->query("START TRANSACTION"); 

// Insert values 
$conn->query("INSERT INTO cards (id, points, reg_date, last_update) VALUES ('','$points', '$reg_date', '$reg_date')"); 
$card_id = $conn->insert_id; 

$conn->query("INSERT INTO students (id, firstname, lastname, email, telephone, birthdate, address, city, cap, fiscal_code, username, card_id, password, token_password, reg_date, is_active) 
    VALUES ('','$student->firstname', '$student->lastname', '$student->email', '$student->telephone', '$student->birthdate', '$student->address', '$student->city', '$student->cap', '$student->fiscal_code', '$student->username', '$card_id','$student->password', '$student->token_password', '$student->reg_date', '$student->is_active')"); 

// Commit transaction 
if (!$conn->commit()) { 
    print("Transaction commit failed\n"); 
    $conn->rollback(); 
} 
$conn->close(); 

$ сопп ссылка создается внутри включаемого файла, и мне нужно, что $ card_id потому, что является внешним ключом в значениях второго запроса. Проблема в том, что если первый запрос завершился неудачно, все в порядке, поэтому запись в моем db не записывается. Но если второй запрос не выполняется, откат не работает, и запись из первого запроса сохраняется в db. Редактировать: Я использую InnoDB. Где я делаю неправильно? Спасибо.

+0

какой двигатель DB вы используете? – sandeepsure

+0

Я забыл написать его, но я использую InnoDB. – Ali

ответ

0

Сначала убедитесь, что ваш ДВД-ДВД - InnoDB.

function begin(){ 
mysql_query("BEGIN"); 
} 

function commit(){ 
mysql_query("COMMIT"); 
} 

function rollback(){ 
mysql_query("ROLLBACK"); 
} 

mysql_connect("localhost","root", "") or die(mysql_error()); 

mysql_select_db("test") or die(mysql_error()); 

begin(); // transaction begins 
// Insert values 
mysql_query("INSERT INTO cards (id, points, reg_date, last_update) VALUES ('','$points', '$reg_date', '$reg_date')"); 
$card_id = $conn->insert_id; 

mysql_query("INSERT INTO students (id, firstname, lastname, email, telephone, birthdate, address, city, cap, fiscal_code, username, card_id, password, token_password, reg_date, is_active) 
VALUES ('','$student->firstname', '$student->lastname', '$student->email', '$student->telephone', '$student->birthdate', '$student->address', '$student->city', '$student->cap', '$student->fiscal_code', '$student->username', '$card_id','$student->password', '$student->token_password', '$student->reg_date', '$student->is_active')"); 


$result = mysql_query($query); 

if(!$result){ 
rollback(); // transaction rolls back 
echo "transaction rolled back"; 
exit; 
}else{ 
commit(); // transaction is committed 
echo "Database transaction was successful"; 
} 

?> 

Надеюсь, это поможет.

+0

Спасибо, я попробую, но мне нужно сделать это объектно-ориентированным способом – Ali

0

Ok я нашел решение, вот рабочий код:

$conn->autocommit(FALSE); 
$conn->query("START TRANSACTION"); 

// Insert values 
$res=$conn->query("INSERT INTO cards (id, points, reg_date, last_update) VALUES ('','$points', '$reg_date', '$reg_date')"); 
$card_id = $conn->insert_id; 

$res1= $conn->query("INSERT INTO students (id, firstname, lastname, email, telephone, birthdate, address, city, cap, fiscal_code, username, card_id, password, token_password, reg_date, is_active) 
    VALUES ('','$student->firstname', '$student->lastname', '$student->email', '$student->telephone', '$student->birthdate', '$student->address', '$student->city', '$student->cap', '$student->fiscal_code', '$student->username', '$card_id','$student->password', '$student->token_password', '$student->reg_date', '$student->is_active')"); 

// Commit transaction 
if ($res and $res1) { 
    $conn->commit();; 
} else {   
    $conn->rollback(); 
} 
$conn->close(); 

Спасибо всем!

Смежные вопросы