如何在MYSQL中实现回滚事务和错误消息

时间:2020-04-28 13:27:29

标签: mysql sql

我有示例程序。

CREATE PROCEDURE `sample_procedure ` 
(
IN IDIn bigint(20),
IN MainIDIn bigint(20),
IN NameIn  varchar(20)
)
 READS SQL DATA
    DETERMINISTIC
BEGIN
INSERT INTO tbl_DEPT
(
ID,
Name)
Select 1,'Mohan';

IF NOT EXISTS (SELECT ID FROM tbl_emp  te  WHERE te.ID = IDIn) THEN 
INSERT INTO tbl_emp
(
MainID,
Name) 
VALUES (MainIDIn,
        NameIn);
ELSE 
IF  EXISTS (SELECT ID FROM tbl_emp  te  WHERE te.ID = IDIn) THEN 
  UPDATE tbl_emp  
  set
    MainID =MainIDIn,
    name = NameIn
  WHERE te.ID= IDIn;
  END IF;
  END IF;
END

致电sample_procedure(1,2,Sampl123)

我只是将一些不相关的数据发送到Procedure中,以便该过程失败。但是我们需要如何实现回滚意味着它应该进入开始状态,同时也不要在tbl_DEPT中插入记录。

在T-SQL中,我们将

BEGIN
    SET NOCOUNT ON
    BEGIN TRANSACTION
    BEGIN TRY
        SET @OUT = "success";
        COMMIT TRANSACTION
    END TRY

    BEGIN CATCH
        set @out = 'not success';
        ROLLBACK TRANSACTION
    END CATCH
END

这种TRY CATCH块并捕获错误

 "ERROR_NUMBER() AS ErrorNumber,
    ERROR_SEVERITY() AS ErrorSeverity"

在MYSQL中,我以同样的方式寻找TRY CATCH和ROLL BACK机制。

如果过程失败,则应该回滚并且不要在任何表中加载。

任何人都可以在MYSQL中建议我。

1 个答案:

答案 0 :(得分:0)

MySQL不使用try / catch。如果使用处理程序,例如将终止SP执行的EXIT处理程序:

class _MyAppState extends State<MyApp>  with WidgetsBindingObserver {
  void initState() {
    super.initState();
   WidgetsBinding.instance.addObserver(this);
   }

  @override
   void dispose() {
     WidgetsBinding.instance.removeObserver(this);
     super.dispose();
   }

//// override this function
 @override
  void didChangeAppLifecycleState(AppLifecycleState state) {
    if(state == AppLifecycleState.resumed)
 /// when user opens app again you can launch url if not already launched.
      _launchURL();
  }


  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: Container(
          color: Colors.blueGrey[100],
          child: Column(
            children: <Widget>[
              SafeArea(
                child: Padding(
                  padding: EdgeInsets.only(top: 5.0),
                  child: Image.asset(
                    'assets/logo.png', **//the image**
                  ),
                ),
              ),
              Padding(
                padding: const EdgeInsets.fromLTRB(5.0, 40.0, 5.0, 30.0),
                child: Text(
                  "Click the button if the \npage didn't load",
                  style: TextStyle(
                    fontSize: 18,
                  ),
                  textAlign: TextAlign.center,
                ),
              ),
              Padding(
                padding: EdgeInsets.only(top: 30.0),
                child: Row(
                  mainAxisAlignment: MainAxisAlignment.center,
                  crossAxisAlignment: CrossAxisAlignment.center,
                  children: <Widget>[
                    SizedBox(
                      width: 250,
                      height: 150,
                      child: RaisedButton(
                        elevation: 20.0,
                        shape: StadiumBorder(
                            //borderRadius: new BorderRadius.circular(20.0),
                            side: BorderSide(
                                color: Color.fromRGBO(194, 39, 56, 1.0))),
                        color: Color.fromRGBO(194, 39, 56, 1.0),
                        onPressed: _launchURL,
                        child: Icon(Icons.arrow_right,
                            color: Color.fromRGBO(20, 21, 46, 1.0), size: 120),
                      ),
                    ),
                  ],
                ),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

还有其他类型的处理程序。