我想调用一个存储过程,在 Laravel 的事务中创建动态视图:
拉拉维尔:
try {
DB::transaction(function() use ($raison_sociale_clean, $coming) {
DB::statement('CALL ps_creer_view_des_produits_fournisseur_supp(?,?)',[substr($raison_sociale_clean,0,30),$coming->id]);
DB::table('produits')->where('fournisseurs_id','=',$coming->id)->delete();
DB::table('fournisseurs')->whereid($coming->id)->delete();
});
echo 'Transaction passée sans erreurs';
} catch(QueryException $e) {
echo "Error dans la requête: " . $e->getMessage();
}
MySQL:
DELIMITER //
CREATE PROCEDURE IF NOT EXISTS ps_creer_view_des_produits_fournisseur_supp(IN nom_view varchar(30), IN id_fournisseur int)
BEGIN
DECLARE query varchar(1000);
set query = concat('CREATE VIEW supp_fournisseur_', nom_view, '_prod AS
SELECT p.id as produit_id, p.designation, p.prix, p.date_expiration, f.id as fournisseurs_id, f.raison_sociale, f.adresse, f.tele
FROM produits p
INNER JOIN fournisseurs f
ON p.fournisseurs_id=f.id
WHERE fournisseurs_id=', id_fournisseur);
PREPARE view_supp from query;
EXECUTE view_supp;
DEALLOCATE PREPARE view_supp;
END //
DELIMITER ;
当我删除包含存储过程的语句时,事务进行得很顺利,所以问题就出在其中。需要注意的是,视图已成功创建,并且已删除给定的服务人员和产品记录。尽管如此,总是弹出“没有活动交易”的错误消息。
我搜索了一下,发现问题可能出在自动提交上,就像存储过程本身进行了提交一样,那么当事务尝试进行提交或回滚时,它将被视为未知事务的新提交。