sql1,sql2兩條語句分別插入到不同的表中,sql2某一個屬性就是sql1插入後自增長的ID值。
我希望使用預先處理來處理sql1和sql2, 同時希望他們執行的時候是在一個事務中, 現在問題就是, 事務中沒提交的操作並沒有真的插入到資料庫中, 所以自增長的ID不存在,sql2插入出錯, 腫麽辦?
我現在處理方法就是不啟動事務, 預先處理sql1, 然後max出結果ID, 在預先處理sql2, 一旦sql2出現異常, 根據ID刪掉記錄。 感覺有點麻煩。
其實我主要想知道,例如cnblog, 文章html內容和文章本身屬性應該不是存在一個表中,如果是兩個表, 他們是怎麼處理同時插入和防注入的......
回複內容:
sql1,sql2兩條語句分別插入到不同的表中,sql2某一個屬性就是sql1插入後自增長的ID值。
我希望使用預先處理來處理sql1和sql2, 同時希望他們執行的時候是在一個事務中, 現在問題就是, 事務中沒提交的操作並沒有真的插入到資料庫中, 所以自增長的ID不存在,sql2插入出錯, 腫麽辦?
我現在處理方法就是不啟動事務, 預先處理sql1, 然後max出結果ID, 在預先處理sql2, 一旦sql2出現異常, 根據ID刪掉記錄。 感覺有點麻煩。
其實我主要想知道,例如cnblog, 文章html內容和文章本身屬性應該不是存在一個表中,如果是兩個表, 他們是怎麼處理同時插入和防注入的......
事務中沒提交的操作並沒有真的插入到資料庫中, 所以自增長的ID不存在
上面這句話就是錯的,是有自增id的。
事物和預先處理衝突嗎? 應該不衝突啊。開啟事物,然後正常預先處理,開啟事物後應該也有自增ID吧。最後判斷是否復原。
那你如果不啟用事務,反而是在插入成功之後在執行sql2,那和事務豈不是沒有區別了?
$sql1 = 'update table1 set val=7 where id=5';$dbh->beginTransaction ();$res = $dbh->exec($sql1);if ($res){ //如果執行成功,那麼執行第二條記錄 $res2 = $dbh->exec('update table1 set val=7 where pid='.$res); if ($res2){ $dbh->commit(); }else{ $dbh->rollback(); }}
不知道這樣對不對~
使用事務就可以了,事務可以做到復原,sql1執行成功了,sql2執行異常,是可以復原的,你可以製造sql2的異常測試下。