当前位置:首页 » 存储配置 » mysql存储过程回滚

mysql存储过程回滚

发布时间: 2022-07-05 16:28:03

① mysql 存储过程 DDL 参数

MySQL8.0 开始支持原⼦ DDL(atomic DDL),数据字典的更新,存储引擎操作,写⼆进制日志结合成了一个事务。在没有原⼦DDL之前,DROP TABLE test1,test2;如遇到server crash,可能会有test1被drop了,test2没有被drop掉。下面来看下在MySQL8.0之前和MySQL8.0 数据字典的区别

在MySQL8.0 之前,Data Dictionary除了存在与.FRM, .TRG, .OPT ⽂件外,还存在于系统表中(MyISAM ⾮事务引擎表中),在MySQL8.0 ,Data Dictionary 全部存在于Data Dictionary Storage Engine(即 InnoDB表中),这使crash recovery 维持原⼦性成为了可能


存储引擎⽀持

目前,只有InnoDB存储引擎⽀持原子DDL,为了实现原子DDL,Innodb要写DDL logs 到 mysql.innodb_ddl_log 表,这是⼀个隐藏在mysql.ibd 数据字典表空间⾥的数据字典表。要看mysql.innodb_ddl_log 中的内容,需要

SET GLOBALLOG_ERROR_VERBOSITY=3;(MySQL 8.0 默认为2,error log 记录Errors and

warnings,不不记录notes)

SET GLOBAL innodb_print_ddl_logs=1;

CREATE TABLEt1 (c1 INT)ENGINE=InnoDB;

查看error log

[Note] [MY-011066] InnoDB: DDL loginsert: [DDLrecord:DELETE SPACE,id=30,

thread_id=25, space_id=9, old_file_path=./test/t1.ibd]

[Note] [MY-011066]InnoDB:DDL logdelete:by id30

[Note] [MY-011066]InnoDB:DDL loginsert: [DDLrecord: REMOVECACHE,id=31,

thread_id=25, table_id=1066, new_file_path=test/t1]

[Note] [MY-011066]InnoDB:DDL logdelete:by id31

[Note] [MY-011066]InnoDB:DDL loginsert: [DDLrecord: FREE,id=32, thread_

id=25, space_id=9, index_id=143, page_no=4]

[Note] [MY-011066]InnoDB:DDL log delete:by id32

[Note] [MY-011066]InnoDB:DDL logpost ddl :begin for thread id: 25

[Note] [MY-011066]InnoDB:DDL logpost ddl :end for thread id: 25


原子DDL 操作步骤

  • 准备:创建所需的对象并将DDL⽇志写入 mysql.innodb_ddl_log表中。DDL日志定义了如何前滚和回滚DDL操作。

  • 执行:执⾏DDL操作。例如,为CREATE TABLE操作执⾏创建。

  • 提交:更新数据字典并提交数据字典事务。

  • Post-DDL:重播并从mysql.innodb_ddl_log表格中删除DDL⽇志。为确保回滚可以安全执⾏⽽不引⼊不⼀致性,在此最后阶段执⾏⽂件操作(如重命名或删除数据文件)。这一阶段还从 mysql.innodb_dynamic_metadata的数据字典表删除的动态元数据为了DROP TABLE,TRUNCATE和其它重建表的DDL操作。

  • ⽆论事务是提交还是回滚,DDL日志都会mysql.innodb_ddl_log在Post-DDL阶段重播并从表中删除 。mysql.innodb_ddl_log如果服务器在DDL操作期间暂停,DDL⽇志应该只保留在表中。在这种情况下,DDL⽇志会在恢复后重播并删除。

    在恢复情况下,当服务器重新启动时,可能会提交或回退DDL事务。如果在重做⽇志和⼆进制日志中存在DDL操作的提交阶段期间执⾏的数据字典事务,则该操作被认为是成功的并且被前滚。否则,在InnoDB重放数据字典重做日志时回滚不完整的数据字典事务 ,并且回滚DDL事务。

    原⼦DDL ⽀持类型

    • DROP TABLES , all tables dropped or none

    • DROP SCHEMA, all entities in the schema are dropped, or none

    • Note that atomic DDL statements will be rolled back or committed even in case of crash, e.g. RENAME TABLES

    • CREATE TABLE would be successfully committed or rolled back (no orphan ibd left)

    • TRUNCATE TABLE (including InnoDB tables with FTS AUX tables) would be successfully committed or rolled back

    • RENAME TABLES, all or none

    • ALTER TABLE successful or not done

    示例

    结论

    在MySQL8.0之前,alter table 操作在server crash的情况下,会遗留.frm,.ibd文件。MySQL8.0 能实现原⼦DDL(包括 DROP TABLE, DROP SCHEMA, CREATE TABLE, TRUNCATE TABLE, ALTER TABLE),alter table 操作,在server crash的情况下,不会遗留.frm,.ibd临时文件。让我们⼀起期待MySQL8.0 GA的到来吧!

② mysql 存储过程rollback后面的语句还会执行吗

会执行。一般
回滚
操作都是写在
异常处理
,或是sql的最后。如果你的sql中出现错误,代码会立即跳转到错误处理代码上执行,比如回滚,但紧接在错误行之后的代码不会执行的。

③ MySQL存储过程事务回滚中有游标遍历,如何处理

请说详细些,最好有贴代码出来

④ mysql存储过程中有没有类似try catch

在存储过程中使用事务时,如果没有try…catch语句,那么当set xact_abort
on时,如果有错误发生,在批处理语句结束后,系统会自动回滚所有的sql操作。当set xact_abort
off时,如果有错误发生,在批处理语句结束后,系统会执行所有没有发生错误的语句,发生错误的语句将不会被执行。

在存储过程中使用事务时,如果存在try…catch语句块,那么当捕获到错误时,需要在catch语句块中手动进行Rollback操作,否则系统会给客户端传递一条错误信息。如果在存储过程开始处将set
xact_abort
on,那么当有错误发生时,系统会将当前事务置为不可提交状态,即会将xact_state()置为-1,此时只可以对事务进行Rollback操作,不可进行提交(commit)操作,那么我们在catch语句块中就可以根据xact_state()的值来判断是否有事务处于不可提交状态,如果有则可以进行rollback操作了。如果在存储过程开始处将set
xact_abort
off,那么当有错误发生时,系统不会讲xact_state()置为-1,那么我们在catch块中就不可以根据该函数值来判断是否需要进行
rollback了,但是我们可以根据@@Trancount全局变量来判断,如果在catch块中判断出@@Trancount数值大于0,代表还有未提交的事务,既然进入catch语句块了,那么还存在未提交的事务,该事务应该是需要rollback的,但是这种方法在某些情况下可能判断的不准确。推荐的方法还是将set
xact_abort on,然后在catch中判断xact_state()的值来判断是否需要Rollback操作。

下面我们来看看两个例子:

一.使用Set xact_abort on

代码

Create proc myProcere

As

begin

set xact_abort on;

begin try

begin tran

insert into TestStu values('Terry','boy',23);

insert into TestStu values('Mary','girl',21);

commit tran

end try

begin catch

--在此可以使用xact_state()来判断是否有不可提交的事务,不可提交的事务

--表示在事务内部发生错误了。Xact_state()有三种值:-1.事务不可提交;

--1.事务可提交;0.表示没有事务,此时commit或者rollback会报错。

if xact_state()=-1

rollback tran;

end catch

end

二.使用Set xact_abort off

代码

Create proc myProcere

As

begin

set xact_abort off;

begin try

begin tran

insert into TestStu values('Terry','boy',23);

insert into TestStu values('Mary','girl',21);

commit tran

end try

begin catch

--在此不可以使用xact_state来判断是否有不可提交的事务

--只可以使用@@Trancount来判断是否有还未提交的事务,未提交的事务未必

--就是不可提交的事务,所以使用@@TranCount>0后就RollBack是不准确的

if @@TranCount>0

rollback tran;

end catch

end

另外,对于@@Trancount需要说明的是,begin tran 语句将 @@Trancount加 1。Rollback tran将
@@Trancount递减到 0,但 Rollback tran savepoint_name 除外,它不影响 @@Trancount。Commit tran 或 Commit work 将 @@Trancount 递减 1。

⑤ mysql 多条语句,怎么判断其中一条执行错误,就执行回滚

写一个存储过程,在存储过程里写一个事物,再把你要的mysql 多条语句写在事物里面就行了,要用的时候调用一下存储过程.大致格式是这样的:

drop procere if exists accessCount;
delimiter $
create procere accessCount()
BEGIN
DECLARE t_error INTEGER DEFAULT 0;/*设置错误增量*/
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET t_error=1;
START TRANSACTION;/*开启事物*/
xxxx(你的语句)
IF t_error = 1 THEN /*执行失败回滚*/
ROLLBACK;
ELSE
COMMIT;
END IF;
end $
delimiter ;

⑥ mysql 存储过程 异常 是否自动 回滚

一般默认情况是会回滚的,但是如果你修改了My.ini文件里面的安全级别就不一定了。

⑦ 写一个Mysql存储过程

CREATE PROCEDURE `xxxx`( )
BEGIN
#设置事务
DECLARE t_error INTEGER DEFAULT 0;
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET t_error=1;
#开启事务
START TRANSACTION;
#插入数据
INSERT INTO 表2(字段21,字段22,字段23)
SELECT 字段11,字段12,字段13 FROM 表1 where xxxx ;
#删除数据
delete 表1 where xxx;
#以上两步操作出现任何失误都将回滚
IF t_error = 1 THEN
ROLLBACK;
ELSE
COMMIT;
END IF;
end;

⑧ mysql存储过程执行一半出现异常会怎么办

如果在存储过程调用的时候显式的调用了事务处理,那么,会回滚,否则执行到那里就在哪里生效。

⑨ mysql 存储过程中update影响行数为0,回滚

使用FOUND_ROWS() 获得影响的行数,再用IF判断是否等于0就行了。

--开始事务
starttransaction;

callsetCoin(zjAmount,0,`uid`,liqType,`type`,info,_betId,serializeId,'');
updateblast_betssetlotteryNo=_kjData,zjCount=_zjCount,bonus=zjAmount,fanDianAmount=_fanDianAmountSelfwhereid=_betId;
IFFOUND_ROWS()=0THEN
ROLLBACK;
ELSE
COMMIT;
ENDIF;
commit;
热点内容
算法结合硬件 发布:2024-10-09 14:11:37 浏览:996
安卓驱动编译进内核 发布:2024-10-09 13:59:30 浏览:600
ubuntunginx编译 发布:2024-10-09 13:27:36 浏览:724
怎么查服务器ip段 发布:2024-10-09 13:08:04 浏览:151
ftpaws 发布:2024-10-09 12:53:20 浏览:272
生化危机5ftp 发布:2024-10-09 12:45:22 浏览:228
系统的安全配置有哪些 发布:2024-10-09 12:31:41 浏览:570
安卓马桶盖怎么拆 发布:2024-10-09 12:19:00 浏览:222
移动硬盘文件夹消失 发布:2024-10-09 12:18:20 浏览:549
编译器会自动为它赋初值 发布:2024-10-09 11:42:28 浏览:350