原博:http://blog.csdn.net/xiaouncle/article/details/52891563

事务是关于原子性的。原子性的概念是指可以把一些事情当做一个不可分割的单元来看待。从数据库的角度看,它是指应全部执行或全部不执行的一条或多条语句的最小组合。 
为了理解事务的概念,需要能够定义非常明确的边界。事务要有非常明确的开始和结束点。SqlServer中的每一条select、insert、update、delete语句都是隐式事务的一部分。即使只发出一条语句,也会把这条语句当做一个事务-或执行语句的所有内容或什么都不执行。但是如果需要的不只是一条,而是多条语句呢?在这种情况下,就需要有一种方法来标记事务的开始和结束,以及事务的成功或失败。可以使用一些T-SQL语句在事务中“标记”这些点。

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

begin tran

事务的开始可能是事物过程中最容易理解的概念。它唯一的目的就是表示一个单元的开始。如果由于某种原因,不能或者不想提交事务,那么这就是所有数据库活动将要回滚的起点。也就是说,数据库会忽略这个起点之后的最终没有提交的所有语句。 
语法如下:

begin tran[saction] [<transaction name>|<@transaction variable>][with mark[<'description'>]] 

commit tran

事务的提交是一个事务的终点。当发出commit tran命令时,可以认为事务执行完毕。也就是说,事务所包含的所有Sql语句执行完毕,事务的影响现在是持久的并会继续,即使系统发生故障也不受影响(只要有备份或数据库文件没有被物理破坏就行)。撤销已完成事务的唯一方法就是发出一个新的事务,从功能上而言,该事务是对上一个事务的反转。 
commit tran语法如下:

commit tran[saction][<transaction name>|<@transaction variable>] 

rollback tran

rollback是进行事务回滚,从关联的begin语句开始发生的任何事情都会被忘记,即撤销该事务包含的所有操作。除了允许保存点外,rollback的语法看上去和begin或commit语句一样:

rollback tran[saction][<transaction name>|<save point name>|<@transaction variable>|<@savepoint variable>]

save tran

保存事务从本质上说就是创建书签(bookmark)。为书签建立一个名称,在建立了“书签”之后,可以在回滚中引用它。创建书签的好处是可以回滚到代码中的特定点上-只要为想要回滚到的那个保存点命名。 
语法如下:

save tran[saction][<save point name>|<@savepoint variable>] 

SqlServer事务实例

UserInfo表结构如图: 
 
事务代码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

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}' ", "");
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();
}
}

SqlServer事务语法及使用方法(转)的更多相关文章

  1. sqlserver 事务日志过大 收缩方法解决方案

    sqlserver 事务日志过大,可能会导致备份失败或者数据库出现异常,所以要定期清除sqlserver 事务日志 建议:为了防止日志文件无限扩大,可以对日志文件作一些限制. 清除sqlserver事 ...

  2. SQLSERVER存储过程语法详解

    CREATE PROC [ EDURE ] procedure_name [ ; number ] [ { @parameter data_type } [ VARYING ] [ = default ...

  3. SqlServer表死锁的解决方法

    SqlServer表死锁的解决方法   前些天写一个存储过程,存储过程中使用了事务,后来我把一些代码注释掉来进行调试找错,突然发现一张表被锁住了,原来是创建事务的代码忘记注释掉.本文表锁住了的解决方法 ...

  4. SQLServer 事务的隔离级别

    SQLServer事务的隔离级别 数据库是要被广大客户所共享访问的,那么在数据库操作过程中很可能出现以下几种不确定情况. 更新丢失(Lost update) 两个事务都同时更新一行数据,但是第二个事务 ...

  5. (转)解释一下SQLSERVER事务日志记录

    本文转载自桦仔的博客http://www.cnblogs.com/lyhabc/archive/2013/07/16/3194220.html 解释一下SQLSERVER事务日志记录 大家知道在完整恢 ...

  6. 解释一下SQLSERVER事务日志记录

    解释一下SQLSERVER事务日志记录 大家知道在完整恢复模式下,SQLSERVER会记录每个事务所做的操作,这些记录会存储在事务日志里,有些软件会利用事务日志来读取 操作记录恢复数据,例如:log ...

  7. Json的语法及使用方法

    Json的语法及使用方法 Json(JavaScript Object Notation)对象表示标识,是一种轻量级的数据交换语言,比XML更容易解析,独立于语言和平台. 语法规则: 对象用{}保存 ...

  8. spring声明式事务 同一类内方法调用事务失效

    只要避开Spring目前的AOP实现上的限制,要么都声明要事务,要么分开成两个类,要么直接在方法里使用编程式事务 [问题] Spring的声明式事务,我想就不用多介绍了吧,一句话“自从用了Spring ...

  9. oracle,mysql,sql server三大数据库的事务隔离级别查看方法

    1:mysql的事务隔离级别查看方法 mysql 最简单,执行这条语句就行:select @@tx_isolation  详情: 1.查看当前会话隔离级别 select @@tx_isolation; ...

随机推荐

  1. [转帖]分布式事务之解决方案(XA和2PC)

    分布式事务之解决方案(XA和2PC) https://zhuanlan.zhihu.com/p/93459200 3. 分布式事务解决方案之2PC(两阶段提交) 针对不同的分布式场景业界常见的解决方案 ...

  2. cookie、session和token的概念

    Cookie.Session和Token都是为了解决Web身份校验而产生的,这里对它们的概念做一个简单了解. Web身份校验的发展 很久很久以前,Web基本上就是文档的浏览而已.既然是浏览,作为服务器 ...

  3. Feign切换client到okhttp无法生效天坑!(附带发生的原因)

    提示:如果只看如何解决问题,请看文章的末尾如何解决这个问题 1. 场景描述 最近项目中使用了feign当做http请求工具来使用.相对于httpclient.resttemplate来说,fegin用 ...

  4. 一个简单的利用 HttpClient 异步下载的示例

    可能你还会喜欢 一个简单的利用 WebClient 异步下载的示例  ,且代码更加新. 1. 定义自己的 HttpClient 类. using System; using System.Collec ...

  5. python 做词云图

    #导入需要模块 import jieba import numpy as np import matplotlib.pyplot as plt from PIL import Image from w ...

  6. .NET CORE 控制台应用程序配置log4net日志文件

    使用文件格式记录日志 1.新建一个.NET CORE控制台应用程序,添加log4net.dll引用,打开工具->NuGet包管理器->管理解决方案的NuGet程序包. 2.在NuGet-解 ...

  7. js计算两经纬度之间的距离

    js如下: // 方法定义 lat,lng function GetDistance( lat1, lng1, lat2, lng2){    var radLat1 = lat1*Math.PI / ...

  8. 基于Custom-metrics-apiserver实现Kubernetes的HPA(内含踩坑)

    前言 这里要说一下Prometheus的检控指标从哪里来,它有3个渠道: 主机监控,也就是部署了Node Exporter组件的主机,它以DaemonSet或者系统进程的形式运行,Prometheus ...

  9. Gin-Go学习笔记三:Gin-Web框架 JS分页

    JS 分页 1>     JS分页,业务逻辑 (1)     分页采用的是一个叫jquery.pagination.js的一个jquery插件 (2)     需要jquery的支持,此项目中使 ...

  10. vue-cli随机生成port源码

    const portfinder = require('portfinder'): const port = await portfinder.getPortPromise(): 两行代码 端口搜索范 ...