簡體   English   中英

存儲過程中的事務總是失敗

[英]Transaction within a stored procedure always failing

我通過 phpmyadmin 創建了一個存儲過程,它執行如下事務:

BEGIN
    DECLARE EXIT HANDLER FOR SQLEXCEPTION
        BEGIN
            SELECT -1;
            ROLLBACK;
        END;
    START TRANSACTION;
      INSERT INTO review(reviewer_name, reviewer_gender, house_id, rental_date_from, rental_date_to, house_rating,house_comment) VALUES (name, gender, house_id, date_from,date_to, clean_rating,comments);
      
      UPDATE rental SET reviewed = 1 WHERE renter_id = renter_id AND house_id = house_id AND date_from = dateFrom AND date_to = dateTo ;
    COMMIT;
    
    SELECT 1;

END

參數設置如下:存儲過程的參數

每次我通過 phpmyadmin 使用有效值執行存儲過程時,我都會返回 -1,並且沒有表受到影響。 不太確定這里出了什么問題。

編輯:添加了一些信息

顯示創建過程 sp_save_review:

| sp_save_review | NO_ZERO_IN_DATE,NO_ZERO_DATE,NO_ENGINE_SUBSTITUTION | CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_save_review`(IN `name` VARCHAR(200), IN `gender` VARCHAR(50), IN `house_id` INT(11), IN `date_from` DATE, IN `date_to` DATE, IN `clean_rating` FLOAT, IN `comments` VARCHAR(1000), IN `renter_id` INT(11))
BEGIN
        DECLARE EXIT HANDLER FOR SQLEXCEPTION
        BEGIN
                SELECT -1;
                ROLLBACK;
        END;
        START TRANSACTION;
          INSERT INTO review(reviewer_name, reviewer_gender, house_id, rental_date_from, rental_date_to, house_rating,house_comment) VALUES (name, gender, house_id, date_from,date_to, clean_rating,comments);

      UPDATE rental SET reviewed = 1 WHERE renter_id = renter_id AND house_id = house_id AND date_from = dateFrom AND date_to = dateTo ;
    COMMIT;

    SELECT 1;

顯示創建表評論:

| review | CREATE TABLE `review` (
  `review_id` int(11) NOT NULL AUTO_INCREMENT,
  `reviewer_name` varchar(200) CHARACTER SET utf32 NOT NULL,
  `reviewer_gender` varchar(50) CHARACTER SET utf32 NOT NULL,
  `house_id` int(11) NOT NULL,
  `rental_date_from` date NOT NULL,
  `rental_date_to` date NOT NULL,
  `house_rating` float NOT NULL,
  `house_comment` varchar(1000) CHARACTER SET utf32 NOT NULL,
  `flagged` tinyint(1) NOT NULL DEFAULT 0,
  `banned` tinyint(1) NOT NULL DEFAULT 0,
  PRIMARY KEY (`review_id`),
  KEY `house_id` (`house_id`),
  CONSTRAINT `review_ibfk_1` FOREIGN KEY (`house_id`) REFERENCES `rental` (`house_id`)
) ENGINE=InnoDB AUTO_INCREMENT=70 DEFAULT CHARSET=latin1 COLLATE=latin1_bin |

顯示創建表租金:

| rental | CREATE TABLE `rental` (
  `renter_id` int(11) NOT NULL,
  `house_id` int(11) NOT NULL,
  `date_from` date NOT NULL,
  `date_to` date NOT NULL,
  `price` double NOT NULL,
  `reviewed` tinyint(1) NOT NULL DEFAULT 0,
  PRIMARY KEY (`renter_id`,`house_id`,`date_from`),
  KEY `house_id` (`house_id`),
  CONSTRAINT `rental_ibfk_1` FOREIGN KEY (`house_id`) REFERENCES `house` (`house_id`),
  CONSTRAINT `rental_ibfk_2` FOREIGN KEY (`renter_id`) REFERENCES `renter` (`renter_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_bin |

你似乎對你的命名很感興趣試試這個

 DROP TABLE IF EXISTS REVIEW;
 DROP TABLE IF EXISTS RENTAL;
 
 
 CREATE TABLE `rental` (
  `renter_id` int(11) NOT NULL,
  `house_id` int(11) NOT NULL,
  `date_from` date NOT NULL,
  `date_to` date NOT NULL,
  `price` double NOT NULL,
  `reviewed` tinyint(1) NOT NULL DEFAULT 0,
  PRIMARY KEY (`renter_id`,`house_id`,`date_from`),
  KEY `house_id` (`house_id`) #,
  #CONSTRAINT `rental_ibfk_1` FOREIGN KEY (`house_id`) REFERENCES `house` (`house_id`),
  #CONSTRAINT `rental_ibfk_2` FOREIGN KEY (`renter_id`) REFERENCES `renter` (`renter_id`)
) ;
 
 
 CREATE TABLE `review` (
  `review_id` int(11) NOT NULL AUTO_INCREMENT,
  `reviewer_name` varchar(200) CHARACTER SET utf32 NOT NULL,
  `reviewer_gender` varchar(50) CHARACTER SET utf32 NOT NULL,
  `house_id` int(11) NOT NULL,
  `rental_date_from` date NOT NULL,
  `rental_date_to` date NOT NULL,
  `house_rating` float NOT NULL,
  `house_comment` varchar(1000) CHARACTER SET utf32 NOT NULL,
  `flagged` tinyint(1) NOT NULL DEFAULT 0,
  `banned` tinyint(1) NOT NULL DEFAULT 0,
  PRIMARY KEY (`review_id`),
  KEY `house_id` (`house_id`),
  CONSTRAINT `review_ibfk_1` FOREIGN KEY (`house_id`) REFERENCES `rental` (`house_id`)
) ;

DROP PROCEDURE IF EXISTS P;
DELIMITER $$
CREATE PROCEDURE  P(IN `Pname` VARCHAR(200), IN `Pgender` VARCHAR(50), IN `Phouse_id` INT(11), 
                          IN `Pdate_from` DATE, IN `Pdate_to` DATE, IN `Pclean_rating` FLOAT, 
                          IN `Pcomments` VARCHAR(1000), IN `Prenter_id` INT(11))
BEGIN
        DECLARE EXIT HANDLER FOR SQLEXCEPTION
        BEGIN
                SELECT -1;
                ROLLBACK;
        END;
        START TRANSACTION;
          INSERT INTO review(reviewer_name, reviewer_gender, house_id, rental_date_from, rental_date_to, house_rating,house_comment) 
             VALUES (Pname, Pgender, Phouse_id, Pdate_from,Pdate_to, Pclean_rating,Pcomments);

          UPDATE rental 
              SET reviewed = 1 
              WHERE renter_id = Prenter_id AND house_id = Phouse_id AND date_from = Pdate_From AND date_to = Pdate_To ;
        COMMIT;

    SELECT 1;
END $$

DELIMITER ;

INSERT INTO RENTAL( `renter_id`, `house_id` ,  `date_from` ,  `date_to` ,  `price`,  `reviewed` )
VALUES (1,1,'2022-01-01','2022-01-01',10,0);

CALL P('AAA','F',1,'2022-01-01','2022-01-01',1,'BBB',1);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM