解读SQL一些语句执行后出现异常不会回滚的问题
作者:SunBairn 发布时间:2024-01-22 12:52:59
SQL一些语句执行后出现异常不会回滚
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等,
总结:设计事务时,不应包含这类语句。如果在事务的前部中发布了一个不能被回滚的语句,则后部的其它语句会发生错误,在这些情况下,通过发布ROLLBACK语句不能 回滚事务的全部效果,简单来说如果这个不
能被回滚的语句之前有事务,并且这个不能被回滚的语句执行异常了,之前的修改操作会隐式的提交。
例如:
这种情况下 int i=5/0;发生异常了,上面的修改操作会发生回滚,修改密码失败的。
这种情况下userMapper.dropField(tableName,fieldName);我故意tableName传一个不存在的表名,这里会抛出异常,但是上面的更新密码操作还是会成功(隐式地提交了事务)
SQL事务回滚的两种方式
1.XACT_ABORT
1)set XACT_ABORT off时,回滚产生错误的Transact-SQL语句,而事务将继续进行处理,(注:错误严重或者语法错误时可能回滚整个事务)
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,状态 4,第 3 行
将截断字符串或二进制数据。
语句已终止。
(1 行受影响)
select * from [dbo].[A]
ID | Name | CreateDate |
1 | 测试off | 2018-10-31 15:06:09.330 |
3 | 测试off | 2018-10-31 15:06:09.333 |
注意:
事务的回滚对于拥有自增主键的表来说,insert的数据是被删除,update和delete的数据是被恢复 。所以上面所显示的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
同样执行select 查询语句 得到如下结果
ID | Name | CreateDate |
1 | 测试off | 2018-10-31 15:06:09.330 |
3 | 测试off | 2018-10-31 15:06:09.333 |
证明事务全部回滚成功。(注意下次新增数据的时候,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,即使子事务提交成功,如果外围事务出错,子事务还是回滚.
来源:https://blog.csdn.net/weixin_44863976/article/details/123716224


猜你喜欢
- 一、主线程会等待所有的子线程结束后才结束首先我看下最普通情况下,主线程和子线程的情况。import threadingfrom time i
- 总的来说:1、数据库设计和表创建时就要考虑性能2、sql的编写需要注意优化3、分区、分表、分库设计表的时候:1、字段避免null值出现,nu
- 本文实例讲述了Python常见MongoDB数据库操作。分享给大家供大家参考,具体如下:MongoDB 是一个基于分布式文件存储的数据库。由
- 自打 Lokesh Dhakar 创造了第一个lightbox应用以来, 相册和弹出窗口方式便跨进了新的时代, 甚至那些lightbox应用
- 很多网友在浏览网页时应该会发现很多网页有显示时间和日期的功能,这个不难,使用可视化网页制作软件Drea
- 一、简介你一定用过那种“OCR神器”,可以把图片中的文字提取出来,极大的提高工作效率。今天,我们就来做一款实时截图识别的小工具。顾名思义,运
- 让 PHP 支持 MySQLPHP 有专有的 MySQL 函数库以使用操作 MYSQL 数据库。在 PHP 5 及以后版本中不再
- 使用EXECL转换时间戳的公式为:代码:=(xxxxxxxxxx+8*3600)/86400+70*365+19使用MYSQL语句解释时间戳
- 介绍一下,如何在php程序中运行Python脚本,在php中python程序的运行,主要依靠 程序执行函数,这里说一下三个相关函数:exec
- 假设在搜索框search中输入:“asp 编程” 先得到输入框中的内容:search=request("search")
- 测试通过: ie6 + opera + FF + chrome if (document.all) { window.attachEvent
- 内容摘要: 网页的色彩搭配往往是网友们感到头疼的问题,尤其是那些完全没有美术基础的网友。到底用
- python有很多有趣的库,其中wxpy是连接微信的接口,具体可以查看官方文档。可以实现自动操作,wxpy 支持 Python 3.4-3.
- 逛网站的时候经常会遇到需要上传图片的操作,这里主要来说下selenium操作上传文件的操作。前提条件:定位的元素必须是type 属性是fil
- 这篇文章主要介绍了在SQL Server中处理空值时所涉及的3个问题:计数、使用空表值以及外键处理。用COUNT(*)处理空值大多数集合函数
- 紧接上篇文章,本篇文章讲vuex ,如何去改变state ,actions的使用,我依然使用了vuex的modules1.设置actions
- python的os module中有fork()函数用于生成子进程,生成的子进程是父进程的镜像,但是它们有各自的地址空间,子进程复制一份父进
- 本文实例讲述了Python使用pymysql模块操作mysql增删改查。分享给大家供大家参考,具体如下:# -*- coding:utf-8
- 基于python的Appium进行b站直播消费记录爬取之前看文章说fiddler也可以进行爬取,但尝试了一下没成功,这次选择appium进行
- 一、下载instant client1.附链接:http://www.oracle.com/technetwork/topics/winx6