所以我正在做的是有多个UPDATE
查询,这会更改tbl_groups
表中的组名,然后更新tbl_users
中属于该组的所有用户,但如果用户更新查询失败,它会更新组,但我想要同时更新或不更新,使用PHP和MySQL。
答案 0 :(得分:2)
听起来你需要做的就是使用交易。
您必须使用InnoDB表来使用事务(实际上,其他一些数据库引擎都有事务,但InnoDB最常用于MySQL)。
在第一次更新之前发出“BEGIN TRANSACTION”查询。
如果任何查询失败,请发出“ROLLBACK”查询以撤消所有内容。
这真的很简单。
如果您决定要进行部分回滚(在事务开始后回到某个点),那么您可以使用“ROLLBACK TO SAVEPOINT savepoint_name”。您将不得不发出第一个“SAVEPOINT savepoint_name”查询。
例如,在PHP中
mysql_query("BEGIN TRANSACTION");
$result1 = mysql_query("UPDATE `tbl_groups` SET `user_id` = 5 WHERE `group_id` = 3");
if($result1 === false) {
mysql_query("ROLLBACK");
}
mysql_query("SAVEPOINT savepoint1");
$result2 = mysql_query("UPDATE `tbl_users` SET `group_id` = 3 WHERE `user_id` = 5");
if($result === false) {
ROLLBACK TO SAVEPOINT savepoint1;
}
// COMMIT saves the changes to the db, making them visible to other sessions
// if the ROLLBACK TO SAVEPOINT statement executed, then only changes up to that SAVEPOINT will be saved
// if no ROLLBACK statements were executed, then all changes will be saved (assuming no MySQL errors that cause implicit ROLLBACK)
mysql_query('COMMIT');
答案 1 :(得分:0)
使用具有最佳隔离级别的交易
我更喜欢“可重复阅读”(在提交交易之前,您无法查看其他数据和vise诗歌)始终是好的,并且它是innodb存储引擎的默认值
如果您不使用innodb,请使用
更改隔离级别SET GLOBAL tx_isolation ='REPEATABLE-READ';或
SET SESSION tx_isolation ='REPEATABLE-READ';
其余细节由@Buttle Butkus提供
答案 2 :(得分:0)
将tbl_groups和tbl_users之间的关系设置为ON DELETE CASCADE
。然后只需更新tbl_groups,更改将级联到tbl_users中的相关记录。如果你必须经常更新你的父键,那么你可以考虑使用代理键。
答案 3 :(得分:0)
以下示例基于面向对象的样式,请确保您的Required数据库表类型是InnoDB,因为它支持事务语句
这里我只想根据ids删除多条记录
$this->link_id->autocommit(FALSE);
//以上语句通过禁用自动提交来启动事务,其中link_id引用您的MySQLi数据库连接
for($i=1; $i<=5; $i++){
$tSql = "DELETE FROM your_table"
. " WHERE id=" . $i;
$rs = $this->link_id->query($tSql);// execute the query
if($this->link_id->affected_rows == -1) // check if it fails
{
$_SESSION["error"] = "Sorry ! cant be deleted ! ";
$this->link_id->rollback(); // rollback the transaction
break; // break the loop
}
}
//check if there is some error or not, if no error then commit the transaction
if(empty($_SESSION["error"])){
$this->link_id->commit();
}