事务——sql server中的事务应用举例
sql中事务只针对一个update,delete,insert语句,如果一段程序中有超过一个这样的语句,就需要每个都判断是否出错,否则就会出现若干我们不希望的情形出现,举例如下(表结构见最后):
1,有三个insert语句(or其它语句),第一个出错,第二个对了,第三个错了,如下:
BEGIN
BEGIN TRANSACTION
print 'bb'
insert into testNewID (a) values('aa')
IF @@error <> 0
BEGIN
print '1'
ROLLBACK TRANSACTION
return
END
-- select * from dd
insert into testNewID(id,a) values(2,'bb')
IF @@error <> 0
BEGIN
print '2'
ROLLBACK TRANSACTION
return
END
insert into testnewid(a) values('cc')
IF @@error <> 0
BEGIN
print '3'
ROLLBACK TRANSACTION
return
END
BEGIN
print 'finished'
COMMIT TRANSACTION
END
SET NOCOUNT OFF
END
--
--delete from testnewid
--select * from testNewID
这样写就没问题,因为每个insert语句都经过了判断,一旦出错,回滚整个事务。如果这样写:
2,
BEGIN
BEGIN TRANSACTION
print 'bb'
insert into testNewID (a) values('aa')
insert into testNewID(id,a) values(2,'bb')
insert into testnewid(a) values('cc')
IF @@error <> 0
BEGIN
print '3'
ROLLBACK TRANSACTION
return
END
BEGIN
print 'finished'
COMMIT TRANSACTION
END
SET NOCOUNT OFF
END
--
--delete from testnewid
--select * from testNewID
这样的话@@error只收到最后一个insert语句的信息,它是对的,所以@@error的值是0,没错,所以不回滚,commit语句执行,第一个插入成功,第二个失败,第三个成功,没有起到事务的作用。
另外,如果程序中除了insert,update,delete之外的语句出现错误,那么整个程序停止,和事务没有关系。事务只针对insert,update,delete这三种操作。
附:用到的表结构 testnewid(id,a),id自增
以上是我自己的一点小经验,可能有不对和不完善的地方,哪位看到了请千万指出来,万分感谢。
今天得到tony的指点,原来这个事务可以优化一下,变得简单:
Begin TRANSACTION
DECLARE @Err int
SET @Err = 0
--在每一个操作语句之后(包括select等除update,insert,delete之外的语句)判断一下@@error
IF @@error <> 0
Set @Err = @@Error
--如果以上的操作中有一个有问题,那么@Err肯定不是零了。就 rollback,如果是零说明没有出错的,
--就commit
IF @Err <> 0
BEGIN
ROLLBACK TRANSACTION
END
ELSE
BEGIN
COMMIT TRANSACTION
END
事务——sql server中的事务应用举例的更多相关文章
- 【转】SQL Server中的事务与锁
SQL Server中的事务与锁 了解事务和锁 事务:保持逻辑数据一致性与可恢复性,必不可少的利器. 锁:多用户访问同一数据库资源时,对访问的先后次序权限管理的一种机制,没有他事务或许将会一塌糊涂 ...
- (4.19)sql server中的事务模式(隐式事务,显式事务,自动提交事务)
(4.19)sql server中的事务模式(隐式事务,显式事务,自动提交事务) 1.概念:隐式事务,显式事务,自动提交事务 2.操作:如何设置事务模式 3.存储过程中的事务 XACT_ABORT 1 ...
- Microsoft SQL Server中的事务与并发详解
本篇索引: 1.事务 2.锁定和阻塞 3.隔离级别 4.死锁 一.事务 1.1 事务的概念 事务是作为单个工作单元而执行的一系列操作,比如查询和修改数据等. 事务是数据库并发控制的基本单位,一条或者一 ...
- SQL Server 中的事务与事务隔离级别以及如何理解脏读, 未提交读,不可重复读和幻读产生的过程和原因
原本打算写有关 SSIS Package 中的事务控制过程的,但是发现很多基本的概念还是需要有 SQL Server 事务和事务的隔离级别做基础铺垫.所以花了点时间,把 SQL Server 数据库中 ...
- Sql Server中的事务隔离级别
数据库中的事物有ACID(原子性,一致性,隔离性,持久性)四个特性.其中隔离性是用来处理并发执行的事务之间的数据访问控制.SqlServer中提供了几种不同级别的隔离类型. 概念 Read UnCom ...
- SQL Server中的事务与其隔离级别之脏读, 未提交读,不可重复读和幻读
原本打算写有关 SSIS Package 中的事务控制过程的,但是发现很多基本的概念还是需要有 SQL Server 事务和事务的隔离级别做基础铺垫.所以花了点时间,把 SQL Server 数据库中 ...
- 浅谈SQL Server中的事务日志(一)----事务日志的物理和逻辑构架
简介 SQL Server中的事务日志无疑是SQL Server中最重要的部分之一.因为SQL SERVER利用事务日志来确保持久性(Durability)和事务回滚(Rollback).从而还部分确 ...
- 第17周翻译:SQL Server中的事务日志管理的阶梯:第5级:在完全恢复模式下管理日志
来源:http://www.sqlservercentral.com/articles/Stairway+Series/73785/ 作者:Tony Davis, 2012/01/27 翻译:刘琼滨. ...
- 第16周翻译:SQL Server中的事务日志管理,级别3:事务日志、备份和恢复
源自: http://www.sqlservercentral.com/articles/Stairway+Series/73779/ 作者: Tony Davis, 2011/09/07 翻译:刘琼 ...
随机推荐
- 制作3D图片立方体旋转特效
<!DOCTYPE html><html><head><meta charset="utf-8" /><title>CS ...
- BeanUtils 学习教程
what happens in more sophisticated environments where you do not necessarily know ahead of time whic ...
- Cocos2d-JS切换场景与切换特效
var HelloWorldLayer = cc.Layer.extend({ sprite:null, ctor:function () { //////////////////////////// ...
- EntityFramework执行SQL语句
在EF中执行Sql语句. using (var context = new EFRecipesEntities()) { string sql = @"insert into Chapter ...
- js中的类GET方法
其实是通过js语句自己建的函数 function request(strParame){ var args = new Object(); ); var pairs = query.split(&qu ...
- Sequential Read Ahead For SQL Server
Balancing CPU and I/O throughput is essential to achieve good overall performance and to maximize ha ...
- Python-S13作业-day1-之登陆程序
Python-S13-day1 需求: 1.让用户输入账号密码,账号密码正确,登陆程序,打印欢迎信息: 2.如果账号,或密码输入错误,提示用户重新输入,用户有三次机会: 3.如果用户第三次输入的账号或 ...
- Python开发【第二章】:Python的数据类型
基本数据类型 一.整型 如: 18.73.84 整型具备如下功能: class int(object): """ int(x=0) -> int or long i ...
- free 命令
free命令可以显示Linux系统中空闲的.已用的物理内存及swap内存,及被内核使用的buffer.在Linux系统监控的工具中,free命令是最经常使用的命令之一. 1.命令格式: free [参 ...
- iptables调试方法
iptables调试时,使用到raw表.ipt_LOG内核模块.日志记录在kern.log中. 具体的步骤如下: 1.准备ipt_LOG内核模块 modprobe ipt_LOG 2.使用raw表,加 ...