PHP-PDO-SQLite에서 트랜잭션에 문제가 있습니다.PHP PDO SQLite. 트랜잭션 및 업데이트 문제
$db = new PDO('sqlite:database1.sqlite');
/*
$rowsnumber1 = $db->exec("CREATE TABLE IF NOT EXISTS questions(
id INTEGER PRIMARY KEY AUTOINCREMENT,
question TEXT NOT NULL,
answers INTEGER NOT NULL
)");
print('$rowsnumber1: '.$rowsnumber1.'<br />');
$rowsnumber2 = $db->exec("CREATE TABLE IF NOT EXISTS answers(
id INTEGER PRIMARY KEY AUTOINCREMENT,
qid INTEGER NOT NULL,
answer TEXT NOT NULL
)");
print('$rowsnumber2: '.$rowsnumber2.'<br />');
*/
//print('Inserting: '); $res = $db->exec("INSERT INTO questions (question,answers) VALUES ('Question',0)"); var_dump($res); print('<br />');
$qid = 1;
try
{
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$db->beginTransaction();
// Variant 1
//print('Executing 1: '); $res1 = $db->exec("INSERT INTO answers (qid,answer) VALUES ($qid,'Answer')"); var_dump($res1); print('<br />');
//print('Executing 2: '); $res2 = $db->exec("UPDATE questions SET answers = answers+1 WHERE id = '".$qid."'"); var_dump($res2); print('<br />');
// Variant 2
print('Preparing 1: '); $statement1 = $db->prepare("INSERT INTO answers (qid,answer) VALUES (:qid,:answer)"); var_dump($statement1); print('<br />');
print('Preparing 2: '); $statement2 = $db->prepare("UPDATE questions SET answers = answers+1 WHERE id='".$qid."'"); var_dump($statement2); print('<br />');
print('Executing 1: '); $res1 = $statement1->execute(array('qid'=>$qid,'answer'=>'Answer')); var_dump($res1); print('<br />');
print('Executing 2: '); $res2 = $statement2->execute(); var_dump($res2); print('<br />');
$db->commit();
}
catch(Exception $e)
{
$db->rollBack();
print("Transaction failed: " .$e->getMessage());
}
질문의 "id"와 답변의 "qid"가 동일하면 ($ qid) 아무런 문제가 없습니다. 문제는 "question"테이블에없는 질문의 "id"가 포함 된 대답을 삽입하려고 할 때 시작됩니다. 예를 들어, "questions"표에는 하나의 질문 ("id"가 "1")이 있고 "id"= "5"라는 질문에 대한 대답을 넣으려고합니다. 대답은 삽입되지만 질문은 "id"= "5"와 같은 질문이 없으므로 업데이트되지 않습니다 (셀 "답변"이 증가하지 않음). 문제는 트랜잭션이 롤백을하지 않고 업데이트가 실제로 실행되지만 결과가 "true"로 업데이트가 실행된다는 것입니다. 거래가 잘못되어 왜 명세서를 사용할 때 업데이트가 "true"를 반환합니까?