sql数据库回滚操作_sql回滚语句 rollback

sql数据库回滚操作_sql回滚语句 rollbackcreatetable testtable(idnvchart(50)primkey,namenvchart(50),remarknvchart(50))select*fromtesttable go BEGINTRY –SQLServer需要显示的定义开始一个事务.BEGINTRANSACTION;–插入2条同样的数据

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

create table testtable (

id nvchart(50) prim key,

name nvchart(50),

remark nvchart(50)

)

select * from testtable

 go

 BEGIN TRY

 — SQL Server 需要显示的定义 开始一个事务.

BEGIN TRANSACTION;

— 插入2条同样的数据,使主键重复,引发错误后回滚事务.

INSERT INTO testtable(id, name) VALUES (4, ‘FOUR’);

INSERT INTO testtable(id, name) VALUES (4, ‘FOUR’);

— 执行成功后,需要提交事务.

COMMIT;

END TRY

 BEGIN CATCH

 PRINT(‘Main.错误代码 = ‘ + STR(ERROR_NUMBER()));

 PRINT(‘Main.错误严重级别 = ‘ + STR(ERROR_SEVERITY()));

 PRINT(‘Main.错误状态代码 = ‘ + STR(ERROR_STATE()));

 PRINT(‘Main.错误信息 = ‘ + ERROR_MESSAGE());

 — 回滚事务

 ROLLBACK;

 END CATCH

 go

 select * from testtable;

 go

二、嵌套事务的层次是由@@TranCount全局变量反映出来的。

每一次Begin Transaction都会引起@@TranCount加1。而每一次Commit Transaction都会使@@TranCount减1,而RollBack Transaction会回滚所有的嵌套事务包括已经提交的事务和未提交的事务,而使@@TranCount置0。

例如

 
 BEGIN TRAN –@@TRANCOUNT值为0
      SELECT @@TRANCOUNT –值为1
          BEGIN TRAN
                SELECT @@TRANCOUNT –值为2
          COMMIT TRAN
          SELECT @@TRANCOUNT –值为1
  ROLLBACK TRAN
  SELECT @@TRANCOUNT –值为0
    
三、

在SQL Server中使用rollback会回滚所有的未提交事务状态,但是有些时候我们只需要回滚部分语句,把不需要回滚的语句提到事务外面来,虽然是个方法,但是却破坏了事务的ACID。

其实我们可以使用SQL Server中的Savepoints来解决上述问题。

示例如下:

1.先建立测试表: 
CREATE TABLE [dbo].[ttt]( 
    [Id] [int] NULL, 
    [mark] [int] NULL 
)

 

2.SQL 语句 
begin tran 
    insert into ttt values(3,’3′); 
save tran point1 
    insert into ttt values(4,’4′);

rollback tran point1

commit

 

执行结果如下: 
Id    mark 
3    3

可见,虽然3,4都在一个事务中,但是由于使用了SavePoints,所以3被提交了,4被回滚了。



版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/179247.html原文链接:https://javaforall.net

(0)
上一篇 2022年8月30日 上午8:46
下一篇 2022年8月30日 上午8:46


相关推荐

  • vue中使用wangeditor_vue富文本编辑器tinymce

    vue中使用wangeditor_vue富文本编辑器tinymce富文本编辑器要求必填,否则alert(‘内容不能为空’),假设字段{{content}}当编辑器输入内容时,如果是字符,content=<p>字符XXXX</p>如果是图片,content=<p><imgsrc=”图片地址”/></p>如果是表情,content=<p>表情</p>如果是空格,content=<p>&nbsp;</p>如果是回车,co.

    2022年10月7日
    6
  • Dify平台图像生成操作及API调用教程

    Dify平台图像生成操作及API调用教程

    2026年3月14日
    2
  • MySQL comment_mysql和oracle的区别

    MySQL comment_mysql和oracle的区别iconv用法场景说明将UTF-8的编码转换成GBK编码,使用Notepad++创建一个UTF-8(无BOM)的编码文件,文件内容简单为风雨在途,保存文件名称为utf8.txt,转换之后存储文件名称为gbk.txt.1.1:iconv命令的使用iconv-fUTF8-tGBKgbk.txt1.2:iconv函数的使用#includesize_ticonv(iconv_tcd…

    2025年8月21日
    4
  • EJB学习笔记

    EJB学习笔记Chapter01企业级开发背景知识一、什么是企业级程序(EnterpriseApplication)? 具有以下特点的程序: (1)围绕商业目的; (2)分布分层的程序架构。二、企业级应用的架构发展历史Host/Terminal(主机/终端,终端不具备处理能力,数据由主机处理)终端为哑终端,可接受命令,不处理命令优点:安全(不能直接访问)

    2022年9月30日
    5
  • 进程间的六种通信方式

    进程间的六种通信方式概述每个进程的用户地址空间都是独立的,一般而言是不能互相访问的,但内核空间是每个进程都共享的,所以进程之间要通信必须通过内核。进程间通信目的一般有共享数据,数据传输,消息通知,进程控制等。以Unix/Linux为例,介绍几种重要的进程间通信方式:管道、消息队列、共享内存、信号量、信号、Socket。六种通信方式管道如果你学过Linux命令,那你肯定很熟悉|这个竖线。$psauxf|grepmysql上面命令行里的|竖线就是一个管道,它的功能是将前一.

    2022年10月11日
    5
  • 数据库建表规则_SQL创建数据表

    数据库建表规则_SQL创建数据表–数据库建表语句的规范小结建表语句的规范:1.字段的设计   A.数据类型尽量用数字类型,数字类型的比字符类型的要快很多。  B.数据类型尽量小,这里的尽量小是指在满足可以预见的未来需求的前提下的,但是有不能太小,  上次监控系统里面的表mon_tair_stat_detail_2012_1的data_size和use_size定义的是int(15)实际上

    2025年8月26日
    8

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号