首页 > 数据库 >SqlServer事务语法及使用方法

SqlServer事务语法及使用方法

时间:2024-04-01 17:44:06浏览次数:28  
标签:事务 end -- sqlSB tran SqlServer begin 语法 error

原文链接:https://blog.csdn.net/xiaouncle/article/details/52891563

事务是关于原子性的。原子性的概念是指可以把一些事情当做一个不可分割的单元来看待。从数据库的角度看,它是指应全部执行或全部不执行的一条或多条语句的最小组合。

可以使用一些T-SQL语句在事务中“标记”这些点。

begin tran:设置起点
commit tran:使事务成为数据库中永久的、不可逆转的一部分
rollback tran:本质上说想要忘记它曾经发生过
save tran:创建一个特定标记,只允许部分回滚

SqlServer事务实例

 事务代码1:

begin tran tran_AddUserInfo --开始事务

declare @tran_error int;
set @tran_error=0;
begin try
  insert into dbo.UserInfo values(2016009,'aaa','2016-08-19 09:13:41.227','男')
  insert into dbo.UserInfo values(2016009,'bbb','2016-08-19 09:13:41.227','哼哼哼')
  insert into dbo.UserInfo values(2016009,'ccc','2016-08-19 09:13:41.227','哈哈哈')
end try
begin catch
  set @tran_error=@tran_error+1; --加分号或不加都能正常执行
end catch
if(@tran_error>0)
begin
  rollback tran tran_AddUserInfo; --执行出错,回滚事务(指定事务名称)
  print @tran_error;
end 
else
begin
  commit tran tran_AddUserInfo; --没有异常,提交事务(指定事务名称)
  print @tran_error;
end

  事务代码2:

begin tran tran_AddUserInfo --开始事务

declare @tran_error int;
set @tran_error=0;
begin try
  insert into dbo.UserInfo values(2016009,'aaa','2016-08-19 09:13:41.227','男')
  insert into dbo.UserInfo values(2016009,'bbb','2016-08-19 09:13:41.227','哈哈')
  insert into dbo.UserInfo values(2016009,'ccc','2016-08-19 09:13:41.227','哈哈')
end try
begin catch
  set @tran_error=@tran_error+1; --加分号或不加都能正常执行
end catch
if(@tran_error>0)
begin
  rollback tran; --执行出错,回滚事务(不指定事务名称)
  print @tran_error;
end 
else
begin
  commit tran; --没有异常,提交事务(不指定事务名称)
  print @tran_error;
end

  

SqlServer记录异常信息

ALTER PROCEDURE [dbo].[proc_SysRole]
	-- Add the parameters for the stored procedure here
	@RoleCode varchar(50),
	@RoleName nvarchar(50), 
	@RoleValue nvarchar(100), 
	@ParentCode varchar(50), 
	@IsActive int
AS
declare @clientId varchar(20);
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET NOCOUNT ON;

    -- Insert statements for procedure here
	begin tran
	begin try
		insert into Sys_Role(RoleCode, RoleName, RoleValue, ParentCode, IsActive)
		values(@RoleCode, @RoleName, @RoleValue, @ParentCode, @IsActive)
	end try
	begin catch
		if(@@TRANCOUNT>0)
		begin
		rollback tran
		--获取执行者所在服务器的ip
		select  @clientId=client_net_address from sys.dm_exec_connections where Session_id=@@spid
		--记录异常信息
		insert into Sys_ProcLog(ClientId, ProcName, ErrorInfo, CreateDate) values(@clientId,ERROR_PROCEDURE(),ERROR_MESSAGE(),GETDATE())
		end
	end catch
	if(@@TRANCOUNT>0)
	begin
	commit tran
	end
END

  

SqlServer无法捕获的异常需要特殊处理

将无法正常捕获异常的T-SQL语句转换成字符串,然后利用exec()执行,就能捕捉到异常了

begin tran tran1
begin try
  TRUNCATE TABLE dbo.Sync_App_Gululu
  --查询Oracle数据库的链接服务器
  exec('INSERT INTO dbo.Sync_App_Gululu SELECT *,GETDATE() AS SyncTime FROM OPENQUERY(SSO_Forumn,''select * from dbo.UserInfo'')')
end try
begin catch
  set @tranError=@tranError+1;
  print 'catch:'+str(@tranError);
end catch
if(@tranError>0)
begin
  rollback tran tran1;
  print 'rollback tran:'+str(@tranError);
end
else
begin 
  commit tran tran1;
  print 'commit tran:'+str(@tranError);
end

  

C#后台代码拼Sql事务语句

public partial class TestSqlTran : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if(!IsPostBack)
        {
            Execute();
        }
    }
    private void Execute()
    {
        string connString = ConfigurationManager.ConnectionStrings["connString"].ToString();
        SqlConnection connection = new SqlConnection(connString);
        StringBuilder sqlSB=new StringBuilder();
        /*sqlSB.AppendLine("begin tran tran_handle")与SqlServer中的换行不是一回事,
          C#后台每行Sql语句后边必须加空格分隔,
          不能用sqlSB.AppendLine("begin tran tran_handle")来替代sqlSB.Append("begin tran tran_handle ")          
        */
        sqlSB.Append("begin tran tran_handle ");
        sqlSB.AppendFormat("declare {0} int;set {0}=0;", "@tran_error");                
        sqlSB.Append("begin try ");
        sqlSB.AppendFormat("delete from Descriptions where Id='{0}' ", "1");
        sqlSB.Append("end try ");
        sqlSB.Append("begin catch ");
        //set @tran_error=@tran_error+1;以分号结尾可以不用空格
        sqlSB.Append("set @tran_error=@tran_error+1;");
        sqlSB.Append("end catch ");
        sqlSB.Append("if(@tran_error>0) begin rollback tran; end ");
        sqlSB.Append("else begin commit tran; end ");
        SqlCommand cmd=new SqlCommand(sqlSB.ToString(),connection);
        connection.Open();
        int count = cmd.ExecuteNonQuery();
        connection.Close();
    }
}

  

标签:事务,end,--,sqlSB,tran,SqlServer,begin,语法,error
From: https://www.cnblogs.com/Dongmy/p/18108959

相关文章

  • MSSQLServer dbo没有智能提示/红色报错波浪线
    使用SQLServer的时候碰到了一个问题,就是已经在[24_3_25]中创建了temp1表,但是左侧对象资源管理器窗口中没显示,而且没有输入提示,还有红色报错波浪线。如图所示解决方法:资源管理器没显示选中“表”选择刷新对于报错波浪线和没提示的问题看看是否是因为开启智能提示点击......
  • MogDB/openGauss中merge的语法解析
    MogDB/openGauss中merge的语法解析近期了解学习了MogDB/openGauss中merge的使用,merge语法是根据源表对目标表进行匹配查询,匹配成功时更新,不成功时插入。简单来说就是有则更新,无则插入,语句简洁,效率高。下面展示MogDB/openGauss中merge的语法openGauss=#\hmergeCo......
  • MogDB/openGauss如何实现事务的rollback
    MogDB/openGauss如何实现事务的rollback本文出处:https://www.modb.pro/db/113262数据库最主要的功能就是存储数据,然而我们在进行数据库操作时,却很容易发生误操作数据的情况,那么在MogDB中该如何实现误操作数据恢复呢?本文通过具体示例简要介绍如何通过回滚还原到误操作前的状......
  • mysql语法和函数使用
    group_concat()参考连接:https://www.jb51.net/article/87328.htm手册上说明:该函数返回带有来自一个组的连接的非NULL值的字符串结果。比较抽象,难以理解。通俗点理解,其实是这样的:group_concat()会计算哪些行属于同一组,将属于同一组的列显示出来。要返回哪些列,由函数参数(就是字......
  • SQLserver 根据表名 转实体类
     declare@TableNamesysname='T1'declare@Resultvarchar(max)='///<summary>///'+@TableName+'///</summary>publicclass'+@TableName+'{'select@Result=@Result+'///<su......
  • Markdown语法
    内容摘自https://markdown.com.cn/basic-syntax/Markdown简介Markdown是一种轻量级标记语言,排版语法简洁,可以让让人们更多地关注内容本身。Markdown使用易读易写的纯文本格式编写文档,可与HTML混编,可导出HTML、PDF以及本身的.md格式的文件。因简洁、高效、易读、易写,Markd......
  • 18_makefile基本语法(下)
    makefile基本语法(下)1.wildcard函数格式:$(wildcardPATTENR)功能:展开指定的目录举例:在/home/test目录有一个a.c的c文件和一个test的文件夹,在/home/test/test文件夹下有一个b.c的文件。​ 我们在当前目录下创建的makefile里面写下如下代码,echo前面加了@符号,echo这......
  • 17_makefile基本语法(上)
    makefile基本语法(上)一.设置vim首行缩进vi/etc/vim/vimrc(rc结尾的一般为配置文件)输入settabstop=4,保存后退出即可。便发现vim打开后的缩进变成4个空格了二.Makefile基本语法语法格式:目标:依赖(tab)命令举例:目标:all依赖:空命令:gcchello.c-ohello上面的例子也......
  • Python基础语法(四)
    目录一.while循环的基础语句二.while循环案例三.while循环的嵌套四.while循环嵌套的案例一.while循环的基础语句1.while的条件需得到布尔类型,True表示继续循环,False表示结束循环。2.需要设置循环终止的条件,如i+=1配合i<100,就能确保100次后停止,否则将无限循环。3......
  • InnoDB 事务模型
    参考资料https://dev.mysql.com/doc/refman/5.7/en/innodb-locking-transaction-model.htmlACID模型ACID模型是一组数据库设计原则,强调业务数据存储的可靠和关键型应用程序运行的稳定。InnoDB存储引擎遵循了ACID设计,可以保证数据不会因软件崩溃和硬件故障等异常情况而丢失。......