溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

SQL一些語句執(zhí)行后出現(xiàn)異常不會回滾的問題怎么解決

發(fā)布時間:2023-05-08 15:00:08 來源:億速云 閱讀:213 作者:zzz 欄目:開發(fā)技術

本篇內容主要講解“SQL一些語句執(zhí)行后出現(xiàn)異常不會回滾的問題怎么解決”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“SQL一些語句執(zhí)行后出現(xiàn)異常不會回滾的問題怎么解決”吧!

    SQL一些語句執(zhí)行后出現(xiàn)異常不會回滾

    MySQL回滾問題

    SQL中會隱式提交的操作:

    1、DDL語句:ALTER DATABASE、ALTER EVENT、ALTER PROCEDURE、ALTER TABLE、ALTER VIEW、CREATE TABLE、DROP TABLE、RENAME TABLE、TRUNCATE TABLE等;

    2、修改MYSQL架構的語句:CREATE USER、DROP USER、GRANT、RENAME USER、REVOKE、SET PASSWORD;

    3、管理語句:ANALYZE TABLE、CACHE INDEX、CHECK TABLE、LOAD INDEX INTO CACHE、OPTIMIZE TABLE、REPAIR TABLE等,

    總結:設計事務時,不應包含這類語句。如果在事務的前部中發(fā)布了一個不能被回滾的語句,則后部的其它語句會發(fā)生錯誤,在這些情況下,通過發(fā)布ROLLBACK語句不能 回滾事務的全部效果,簡單來說如果這個不

    能被回滾的語句之前有事務,并且這個不能被回滾的語句執(zhí)行異常了,之前的修改操作會隱式的提交。 

    例如

    這種情況下 int i=5/0;發(fā)生異常了,上面的修改操作會發(fā)生回滾,修改密碼失敗的。

    SQL一些語句執(zhí)行后出現(xiàn)異常不會回滾的問題怎么解決

    這種情況下userMapper.dropField(tableName,fieldName);我故意tableName傳一個不存在的表名,這里會拋出異常,但是上面的更新密碼操作還是會成功(隱式地提交了事務)

    SQL一些語句執(zhí)行后出現(xiàn)異常不會回滾的問題怎么解決

    SQL事務回滾的兩種方式

    1.XACT_ABORT

    1)set XACT_ABORT off時,回滾產生錯誤的Transact-SQL語句,而事務將繼續(xù)進行處理,(注:錯誤嚴重或者語法錯誤時可能回滾整個事務)

    2) set XACT_ABORT ON時,如果Transact-SQL語句產生運行時錯誤,整個事務將終止并回滾,

    步驟1:

    CREATE TABLE [dbo].[A](
    	[ID] [int] IDENTITY(1,1) NOT FOR REPLICATION NOT NULL,
    	[Name] [nvarchar](5) NULL,
    	[CreateDate] [datetime] NULL,
     CONSTRAINT [PK_A] PRIMARY KEY CLUSTERED 
    (
    	[ID] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    
    GO
    
    --默認XACT_ABORT=off
    SET XACT_ABORT off
    begin tran
    insert into [dbo].[A](Name,CreateDate) values('測試off',GETDATE());
    insert into [dbo].[A](Name,CreateDate) values('測試off_異常',GETDATE());
    insert into [dbo].[A](Name,CreateDate) values('測試off',GETDATE());
    commit tran

    (1 行受影響)

    • 消息 8152,級別 16,狀態(tài) 4,第 3 行

    • 將截斷字符串或二進制數(shù)據(jù)。

    • 語句已終止。

    (1 行受影響)

    select * from [dbo].[A]
    IDNameCreateDate
    1測試off

    2018-10-31 15:06:09.330

    3測試off2018-10-31 15:06:09.333

    注意:

    事務的回滾對于擁有自增主鍵的表來說,insert的數(shù)據(jù)是被刪除,update和delete的數(shù)據(jù)是被恢復 。所以上面所顯示的ID=3 。

    步驟2:

    set XACT_ABORT  ON
    begin tran
    insert into [dbo].[A](Name,CreateDate) values('測試on',GETDATE());
    insert into [dbo].[A](Name,CreateDate) values('測試on_異常',GETDATE());
    insert into [dbo].[A](Name,CreateDate) values('測試on',GETDATE());
    commit tran

    同樣執(zhí)行select 查詢語句 得到如下結果

    IDNameCreateDate
    1測試off

    2018-10-31 15:06:09.330

    3測試off2018-10-31 15:06:09.333

    證明事務全部回滾成功。(注意下次新增數(shù)據(jù)的時候,ID的值。。。)

    2.rollback

    在sql中用事務的時候一般是這么寫。

    declare @error int ;
    begin tran
    begin try
    insert into [dbo].[A](Name,CreateDate) values('測試異常',GETDATE());
    insert into [dbo].[A](Name,CreateDate) values('測試異常_錯誤',GETDATE());
    insert into [dbo].[A](Name,CreateDate) values('測試異常',GETDATE());
    end try
    begin catch
    set @error=1
    end catch
    if @error>0
    	rollback tran
    else
    	commit tran

    注:

    判斷事務回滾,則整個事務里面的sql語句一起回滾,跟SET XACT_ABORT ON相似,不同的是當事務進行嵌套時,如果用事務判斷的方法,嵌套的子事務不出錯,外面語句出錯,那么整個事務只會回滾外面出錯的語句,子事務提交成功了就回滾不了了,但是用SET XACT_ABORT ON,即使子事務提交成功,如果外圍事務出錯,子事務還是回滾.

    到此,相信大家對“SQL一些語句執(zhí)行后出現(xiàn)異常不會回滾的問題怎么解決”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續(xù)學習!

    向AI問一下細節(jié)

    免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經查實,將立刻刪除涉嫌侵權內容。

    sql
    AI