Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP/MySQLi如果在执行复杂过程时发生崩溃,会发生什么情况?_Php_Triggers_Mysqli_Rollback - Fatal编程技术网

PHP/MySQLi如果在执行复杂过程时发生崩溃,会发生什么情况?

PHP/MySQLi如果在执行复杂过程时发生崩溃,会发生什么情况?,php,triggers,mysqli,rollback,Php,Triggers,Mysqli,Rollback,我正在开发一个基于php/MySQLi的网站。我有一个问题,如果某个原因的页面在执行复杂的过程中崩溃,会发生什么。 例如: if (get_message_call) { add something to table 1 add something to table 2 add something to table 3 ( based on some values inserted into table2 ) add something to table 4

我正在开发一个基于php/MySQLi的网站。我有一个问题,如果某个原因的页面在执行复杂的过程中崩溃,会发生什么。 例如:

if (get_message_call)
{
    add something to table 1
    add something to table 2
    add something to table 3   ( based on some values inserted into table2 ) 
    add something to table 4
    etc...
}
我使用PHPmyAdmin(InnoDB)构建了数据库。但我还没有分配任何关系,因为主键/外键在理论上并没有起作用(也许我把它搞错了)

我的主要关注点是,如果某个原因的语句被中止(页面崩溃,松散连接等),在中间,让我们执行“添加到表3”。我猜第一条和第二条语句会被执行,而其他语句不会

确保不会发生这种情况的最佳方法是什么,因为它可能会弄乱其他表的键等。。我的解释可能有点模糊,但我希望有人能理解我的观点

我读过“存储过程和触发器中的回滚和提交”一文,但我不确定我是否理解正确


提前谢谢

如果是InnoDB,那么应该使用事务进行此类插入。有关更多信息,请参阅:


在这种情况下,您应该使用数据库事务。当您必须更新多个表,并且更新依赖于以前的更新时,将代码放入数据库中的存储过程是最安全的。存储过程可以启动一个事务,该事务只有在正确完成时才会将数据提交到数据库(这意味着如果写入一个表,则写入第二个表,但第三次写入失败,则第一次和第二次写入也会回滚)

下面是一个示例-存储过程接受3个输入参数,返回2个输出值并更新3个表。如果有任何错误,事务将回滚。(请注意,这只是一个示例,可能存在一些小的语法错误)


好吧,看起来没那么复杂。现在我松了一口气。谢谢你抽出时间。
CREATE DEFINER=`root`@`localhost` PROCEDURE `doSomething`(
  IN input1 INT,
  IN input2 VARCHAR(255),
  IN input3 VARCHAR(100),
  OUT output1 INT,
  OUT output2 INT
)
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN ROLLBACK; END;
DECLARE EXIT HANDLER FOR SQLWARNING BEGIN ROLLBACK; END;
DECLARE EXIT HANDLER FOR NOT FOUND BEGIN ROLLBACK; END;

START TRANSACTION;

INSERT INTO table1 (column1, column2, column3) VALUES (input1, input2, NOW());
SET @new_row_id = LAST_INSERT_ID();


INSERT INTO table2 (column1, colum2) VALUES (@new_row_id, input3);
SET @other_new_row_id = LAST_INSERT_ID();

UPDATE table3 SET mycolumn = @other_new_row_id WHERE id = @new_row_id;

COMMIT;

SET output1 = @new_row_id;
SET output2 = @other_new_row_id;

END