事务是实现原子性的手段,原子性是指某些事情要么全部发生,要么都不发生,我们都知道,程序的执行是有顺序的,在程序的执行过程中,难免会出现错误,如果对于某些必须作为原子性事务发生的事,在执行过程中,有一部执行了,还有另外一部分由于某种错误而没有执行,就会出现大麻烦。大部分的数据库书都会举这个例子,如果Alina在她的帐号A上取走了1000元,存在帐号B上,我们一般都会这么写

update checking set A=A-1000 where CountName='Alina'

update saving set B=B+1000 where CountName='Alina'

但如果第一条语句执行了,而第二条没有执行,那么就会有问题了,我们现在希望这两条语句要么都执行,要么都不执行,这就要用到事务了。

下面我就举一个小例子帮大家理解一下。

首先我们来建一个测试表

create table MyTranTest
(
   OrderID int primary key identity
)

现在我们写一些代码来测试一下
begin tran TranStart
insert into MyTranTest default values
save tran FirstPoint
insert into MyTranTest default values
rollback tran FirstPoint
insert into MyTranTest default values
save tran SecondPoint
insert into MyTranTest default values
rollback tran SecondPoint
insert into MyTranTest default values
commit tran TranStart

然后我们在使用 select * from MyTranTest

结果如下:

也许你就会纳闷了,明明是五条Insert语句,怎么只执行了三条。

那我们就一起看一下吧

begin tran TranStart

现在是开始事务的时候,这开始了“要么全部,要么全不”的语句组合,然后是Insert一行,在这个结合点,只有一条语句被插入,下一步创建一个保存点,名为FirstPoint,然后在插入另一行,在这时已经有两行被插入了,但记住,他们都尚未被提交,因此数据库并不把他们作为数据库的一部分。

接下来是Rollback操作,说明白一点,并不是回滚到起始点,而是回滚到FirstPoint。通过这次回滚,在进行Rollback时刻和FirstPoint保存点之间的每件事情都被撤销。现在你应该明白了表中为什么只有三条数据了吧,下面的两个过程跟上面的一样,最后我们调用Committed tran语句,他锁住我们的事务,让他成为数据库历史的永久部分。

转载于:https://www.cnblogs.com/wolfcool/archive/2009/06/11/1501004.html

sqlserver 事务例子相关推荐

  1. SQLServer 事务的隔离级别

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

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

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

  3. SQLServer 事务复制中使用脚本添加某个对象的发布

    SQLServer 事务复制中使用脚本添加某个对象的发布 原文:SQLServer 事务复制中使用脚本添加某个对象的发布 -- use [发布库] --添加表:创建项目并将其添加到发布中 exec s ...

  4. sqlserver 事务日志已满和'PRIMARY'

    sqlserver 事务日志已满和'PRIMARY' 1.出现这个问题是日志文件达到了单个文件的极限了要解决这个问题有两个方法 1.删除日志:解决方法是这样子的:DUMP TRANSACTION 库名 ...

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

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

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

    sqlserver 事务日志过大 收缩方法解决方案 参考文章: (1)sqlserver 事务日志过大 收缩方法解决方案 (2)https://www.cnblogs.com/QingKing/p/4 ...

  7. SqlServer 事务回滚

    SqlServer 事务回滚 SQL事务 一.事务概念 事务是一种机制.是一种操作序列,它包含了一组数据库操作命令,这组命令要么全部执行,要么全部不执行.因此事务是一个不可分割的工作逻辑单元.在数据库 ...

  8. 事务例子_图文详解:数据库事务与锁

    什么是事务(Transaction)? 是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行.事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源 ...

  9. 事务例子_Redis事务系列之一Redis事务详解

    一.前言 本章是redis事务系列知识第一章,redis事务系列主要讲解以下内容: redis 事务 redis乐观锁讲解 redis乐观锁实现秒杀 我们一步一步来,本章主要讲解事务. 二.事务 2. ...

最新文章

  1. java gettext_JAVA中getText()怎么从一个JTextArea中读出内容?
  2. CSS布局之-水平垂直居中
  3. 快速入门分库分表概念原理
  4. 入门大爆炸式发展的深度学习,你先要了解这4个最流行框架
  5. ionic3学习之Android平台打包方式
  6. git add -u与-A .三者的区别
  7. java自定义返回码_java – 自定义HTTP状态代码
  8. idea:打包jar(原文by曲高终和寡)
  9. js中split之正则运用(模式匹配)
  10. Matlab系列教程_基础知识_程序控制
  11. python request模块下载_python中的Requests模块
  12. 应用计算机测线性电阻伏安特性曲线,测绘线性电阻和非线性电阻的伏安特性曲线.pdf...
  13. c语言矩形法e3x x7,矩形法(梯形法)求定积分的方法
  14. html分享到微博,h5页面分享到微信、朋友圈、新浪微博、QQ空间、QQ好友组件
  15. Pyrene-PEG3400-NHS,琥珀酰亚胺酯(NHS)官能化的芘-PEG
  16. 计算机集群英语怎么说,cluster是什么意思_cluster的翻译_音标_读音_用法_例句_爱词霸在线词典...
  17. C / C++:斗兽棋型比较大小
  18. Schneider IMD-IM10
  19. JavaScript面试必问(一)闭包的理解
  20. JS正则表达式中有哪些特殊字符,这些特殊字符又分别表示什么含义?

热门文章

  1. 一个很有借鉴价值的编程故事(转)
  2. SQL Server之视图基础知识
  3. 安装VS2008新挫折
  4. android ListView 局部刷新
  5. android 获取手机运行的进程
  6. android 格式化代码
  7. Context结构图
  8. Java调用js方法
  9. Python的DEBUG LOG
  10. LOD优化策略-通篇