189 8069 5689

mysql触发器怎么回滚 mysql自动回滚

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

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

创新互联专注为客户提供全方位的互联网综合服务,包含不限于网站设计制作、成都网站制作、阳江网络推广、小程序制作、阳江网络营销、阳江企业策划、阳江品牌公关、搜索引擎seo、人物专访、企业宣传片、企业代运营等,从售前售中售后,我们都将竭诚为您服务,您的肯定,是我们最大的嘉奖;创新互联为所有大学生创业者提供阳江建站搭建服务,24小时服务热线:18980820575,官方网址:www.cdcxhl.com

drop procedure if exists accessCount;

delimiter $

create procedure 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 ;

触发器中执行回滚SQL SERVER2000,,,高分

如果 @@TRANCOUNT 的值在存储过程完成时与过程执行时不同,则会生成一个 266 信息类错误。该错误不是由触发器中同一个条件生成的。

当调用存储过程时,如果 @@TRANCOUNT 为 1 或更大,并且该过程执行 ROLLBACK TRANSACTION 或 ROLLBACK WORK 语句,则会产生 266 号错误。这是因为 ROLLBACK 回滚所有未完成的事务,并将 @@TRANCOUNT 减到 0,该值比调用过程时要小。

如果在触发器中发出 ROLLBACK TRANSACTION:

◆对当前事务中的那一点所做的所有数据修改都将回滚,包括触发器所做的修改。

◆触发器继续执行 ROLLBACK 语句之后的所有其余语句。如果这些语句中的任意语句修改数据,则不回滚这些修改。执行其余的语句不会激发嵌套触发器。

◆在批处理中,所有位于激发触发器的语句之后的语句都不被执行。

◆触发器中的 ROLLBACK 关闭并释放所有在包含激发触发器的语句的批处理中声明和打开的游标。这其中包括了在激发触发器的批处理所调用的存储过程中声明和打开的游标。在激发触发器的批处理之前的批处理中所声明的游标将只是关闭,但是在以下条件下,STATIC 或 INSENSITIVE 游标不关闭:

·CURSOR_CLOSE_ON_COMMIT 设置为OFF。

·静态游标要么是同步游标,要么是完全填充的异步游标。

当执行触发器时,触发器的操作总是好像有一个未完成的事务在起作用。如果激发触发器的语句是在隐性或显式事务中,则肯定会这样。在自动提交模式下,也是如此。当语句开始以自动提交模式执行时,如果遇到错误,则会有隐含的 BEGIN TRANSACTION 语句允许恢复该语句生成的所有修改。该隐含的事务对批处理中的其它语句没有影响,因为当语句完成时,该事务要么提交,要么回滚。但是,当调用触发器时,该隐含的事务将仍然有效。

这意味着,只要触发器中发出 BEGIN TRANSACTION 语句,则实际上就开始了一个嵌套事务。因为当回滚嵌套事务时,嵌套的 BEGIN TRANSACTION 语句将被忽略,触发器中发出的 ROLLBACK TRANSACTION 总是回滚过去该触发器本身发出的所有 BEGIN TRANSACTION 语句。ROLLBACK 回滚到最外部的 BEGIN TRANSACTION。

若要在触发器中进行部分回滚,则即使总是以自动提交模式进行调用,也必须使用 SAVE TRANSACTION 语句。以下的触发器阐明了这一点:

CREATE TRIGGER TestTrig ON TestTab FOR UPDATE AS

SAVE TRANSACTION MyName

INSERT INTO TestAudit

SELECT * FROM inserted

IF (@@error 0)

BEGIN

ROLLBACK TRANSACTION MyName

END

这也影响触发器中 BEGIN TRANSACTION 语句后面的COMMIT TRANSACTION 语句。因为 BEGIN TRANSACTION 启动一个嵌套事务,而随后的 COMMIT 语句只应用于该嵌套事务。如果在 COMMIT 之后执行 ROLLBACK TRANSACTION 语句,那么 ROLLBACK 将一直回滚到最外部的 BEGIN TRANSACTION。以下的触发器阐明了这一点:

CREATE TRIGGER TestTrig ON TestTab FOR UPDATE AS

BEGIN TRANSACTION

INSERT INTO TrigTarget

SELECT * FROM inserted

COMMIT TRANSACTION

ROLLBACK TRANSACTION

此触发器绝对不会在 TrigTarget 表中插入。BEGIN TRANSACTION 总是启动一个嵌套事务。COMMIT TRANSACTION 只提交嵌套事务,而下面的 ROLLBACK TRANSACTION 则一直回滚到最外部的 BEGIN TRANSACTION。

MySQL触发器怎么实现回滚

Mysql的触发器和存储过程一样,都是嵌入到mysql的一段程序。

触发器是mysql5新增的功能,目前线上凤巢系统、北斗系统以及哥伦布系统使用的数据库均是mysql5.0.45版本,很多程序比如fc-star管理端,sfrd(das),dorado都会用到触发器程序,实现对于数据库增、删、改引起事件的关联操作。


网站标题:mysql触发器怎么回滚 mysql自动回滚
转载注明:http://cdxtjz.cn/article/hpdije.html

其他资讯