事物处理
 
事务是SQL Server中的单个逻辑单元,一个事务内的所有SQL语句作为一个整体执行,要么全部执行,要么都不执行。
事务有4个属性,称为ACID(原子性、一致性、隔离性和持久性)
 
原子性   事务必须是原子工作单元。对于其数据修改,要么全都执行,要么全都不执行。
一致性  事务在完成时,必须使所有的数据都保持一致状态。
隔离性  由并发事务所做的修改必须与任何其他并发事务所做的修改隔离。
持久性  事务完成之后,它对于系统的影响是永久性的。
 
 
 
事务分类
 
按事务的启动和执行方式,可将事务分为3类:
 
1.显示事务:显式地定义启动和结束的事务。
 
2.自动提交事务:自动提交模式是SQL Server的默认事务管理模式。每个Transact-SQL语句在完成时,都被提交或回滚。如果一个语句成功地完成,则提交该语句;如果遇到错误,则回滚该语句。
 
3.隐性事务:当连接以隐性事务模式进行操作时,SQL Server将在提交或回滚当前事务后自动启动新事务。无须描述事务的开始,只须提交或回滚每个事务。隐性事务模式形成连续的事务链。
 
 
 

1.显示事务

 
显示事务需要显示地定义事务的启动和结束。

它是通过 BEGIN TRANSACTION 、 COMMIT TRANSACTION 、ROLLBACK TRANSACTION 、 SAVE TRANSACTION 等Transact-SQL语句来完成的。

 
启动事务: BEGIN TRANSACTION 。
结束事务: COMMIT TRANSACTION 。例如:
 use test
go /*启动一个事务向student表中插入一个记录*/
begin transaction
insert into student values(100,'陈浩','男',19)
commit tran select * from student
go
 
 
回滚事务: ROLLBACK TRANSACTION 。例如:
 /*启动一个事务向student表中删除一个记录,然后回滚该事务*/
begin transaction
delete student where sno=100
rollback select * from student --由于回滚该事务,因此student表中没有插入记录。
go
在事务内设置保存点: SAVE TRANSACTION 。保存点是如果有条件的取消事务的一部分,事务可以返回的位置。例如:
 /*在事务内设置保存点*/
begin transaction mytran --启动事务
select * from student
save transaction s1 --设置保存点。
insert into student values(200,'王洪','男',22) --插入另一个学生的记录
rollback transaction s1 --事务回滚到保存点s1
commit transaction
go
select * from student --陈浩插入到表中而王洪没有插入到表中
不能用于事务的操作:

操作

相应的SQL语句

创建数据库

CREATE DATABASE

修改数据库

ALTER DATABASE

删除数据库

DROP DATABASE

恢复数据库

RESTORE DATABASE

加载数据库

LOAD DATABASE

备份日志文件

BACKUP LOG

恢复日志文件

RESTORE LOG

更新统计数据

UPDATE STATISTICS

授权操作

GRANT

复制事务日志

DUMP TRANSACTION

磁盘初始化

DISK INIT

更新使用sp_configure系统存储过程更改的配置选项的当前配置值

RECONFIGURE

2.自动提交事务

SQL Server没有使用BEGIN TRANSACTION语句启动显式事务,或隐性事务模式未打开,将以自动提交模式进行操作。
当提交或回滚显式事务或者关闭隐性事务模式时,SQL Server将返回到自动提交模式。

3.隐式事务

隐性事务模式设置为打开之后,当SQL Server首次执行某些Transact-SQL语句时,都会自动启动一个事务,而不需要使用 BEGIN TRANSACTION 语句。
启动新事务的Transact-SQL语句包括:
 
 
 
在发出COMMIT或ROLLBACK语句之前,该事务一直保持有效。在第一个事务被提交或回滚之后,下次当连接执行这些语句的任何语句时,SQL Server都将自动启动一个新事务。
 
隐性事务模式可以通过使用SET语句来打开或者关闭,其语法格式为: SET IMPLICIT_TRANSACTIONS { ON | OFF } 
 
隐性事务模式打开时,用户必须在该事务结束时显式提交或回滚。
 
隐性事务模式将保持有效,直到执行   SET IMPLICIT_TRANSACTIONS OFF 语句使连接返回到自动提交模式。
 
例如:

 /*演示在将IMPLICIT_TRANSACTIONS设置为ON时显式或隐式启动事务。
使用@@trancount函数返回当前连接的活动事务数。 */
set nocount on
print cast(@@trancount as char(5))
create table table1(a int)
insert table1 values(1)
go
print cast(@@trancount as char(5)) print '使用显式事务'
begin tran
insert table1 values(2)
print '当前连接的活动事务数:'+cast(@@trancount as char(5))
commit tran print '当前连接的活动事务数:'+cast(@@trancount as char(5))
go print '设置 implicit_transactions为on'
set implicit_transactions on
go
print '使用隐式事务'
insert into table1 values(4) --这里不需要begin tran语句来定义事务的启动
print '当前连接的活动事务数:'+ cast(@@trancount as char(5))
commit tran
print '当前连接的活动事务数:'+ cast(@@trancount as char(5))
go drop table table1
set implicit_transactions off /*BEGIN TRANSACTION 语句使 @@TRANCOUNT 递增 1。
ROLLBACK TRANSACTION 将 @@TRANCOUNT 递减为 0,
但 ROLLBACK TRANSACTION savepoint_name 语句并不影响
@@TRANCOUNT 值。COMMIT TRANSACTION 将 @@TRANCOUNT 递减 1。*/
 
分布式事务
 
跨越两个或多个服务器上的数据库的事务就是分布式事务。
与本地事务的不同在于事务的提交(2pc)
控制分布式事务的T-SQL语句包括: begin distributed transaction 、 commit transaction\commit work 、 rollback transaction\rollback work 

数据的锁定

并发问题包括:修改丢失;脏读;不可重复读;幻读
事务的隔离级别:未提交读;提交读;可重复读;可串行读
 
SQL SERVER 2005中的锁: 共享锁; 排它锁;更新锁;意向锁;架构锁
 
封锁技术需要解决的问题:死锁
 
 
锁的若干自定义操作:

1.通过Set lock_timeout 设置事务被阻塞的最长时间;通过@@lock_timeout查看。例如:

 /*查看@@lock_timeout*/
print @@lock_timeout --LOCKTIMEOUT 的缺省值是 -1,这意味着将没有锁超时 set lock_timeout 1800
print @@lock_timeout

2. 定义事务隔离级别(4种) set transaction isolation level ... 。

3. 锁定提示。例如:

 /*在select,insert,update和delete等语句中使用表级锁定提示*/
set transaction isolation level serializable
begin tran
select * from student with(tablock)
exec sp_lock
commit tran select object_name(1013578649)

sql server 事务处理的更多相关文章

  1. SQL SERVER事务处理

    SQL SERVER事务处理   一.事务定义: 事务是单个的工作单元.如果某一事务成功,则在该事务中进行的所有数据更改均会提交,成为数据库中的永久组成部分. 如果事务遇到错误且必须取消或回滚,则所有 ...

  2. SQL Server 事务处理 回滚事务

    --创建表: GO CREATE TABLE [dbo].[tb1]( [Id] [int] NOT NULL, [c1] [nvarchar](50) NULL, [c2] [datetime] N ...

  3. Oracle与SQL Server事务处理的比较

    事务处理是所有大型数据库产品的一个关键问题,各数据库厂商都在这个方面花费了很大精力,不同的事务处理方式会导致数据库性能和功能上的巨大差异.事务处理也是数据库管理员与数据库应用程序开发人员必须深刻理解的 ...

  4. c# + Sql server 事务处理

    事务(Transaction)是并发控制的单位,是用户定义的一个操作序列.这些操作要么都做,要么都不做,是一个不可分割的工作单位. 通过事务,SQL Server能将逻辑相关的一组操作绑定在一起,以便 ...

  5. SQL SERVER 数据库实用SQL语句

    --查看指定表的外键约束 select * from sysobjects where parent_obj in( select id from sysobjects where name='表名' ...

  6. SQL Server 2000中查询表名,列名及字段类型

    经常碰到一些忘记表名称的情况,此时只记得个大概,此时可通过查询系统表Sysobjects找到所要的表名,如要查找包含用户的表名,可通过以下SQL语句实现, Select * From sysobjec ...

  7. SQL点滴9—SQL Server中的事务处理以及SSIS中的内建事务

    原文:SQL点滴9-SQL Server中的事务处理以及SSIS中的内建事务 我们可以把SSIS中的整个package包含在一个事务中,但是如果在package的执行过程中有一个表需要锁定应该怎么处理 ...

  8. TransactionScope事务处理方法介绍及.NET Core中的注意事项 SQL Server数据库漏洞评估了解一下 预热ASP.NET MVC 的VIEW [AUTOMAPPER]反射自动注册AUTOMAPPER PROFILE

    TransactionScope事务处理方法介绍及.NET Core中的注意事项   作者:依乐祝 原文链接:https://www.cnblogs.com/yilezhu/p/10170712.ht ...

  9. SQL Server在存储过程中编写事务处理代码的三种方法

    SQL Server中数据库事务处理是相当有用的,鉴于很多SQL初学者编写的事务处理代码存往往存在漏洞,本文我们介绍了三种不同的方法,举例说明了如何在存储过程事务处理中编写正确的代码.希望能够对您有所 ...

随机推荐

  1. Centos修改DNS重启或者重启network服务后丢失问题处理

    本文版权归mephisto和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作. 文章是哥(mephisto)写的,SourceLink 阅读目录 介绍 起因 处理 GitHub 本文版 ...

  2. spring中各jar功能及jar包之间的依赖关系

    (1) spring-core.jar 这个jar文件包含Spring框架基本的核心工具类,Spring其它组件要都要使用到这个包里的类,是其它组件的基本核心,当然你也可以在自己的应用系统中使用这些工 ...

  3. 烂泥:SQL Server 2005数据库安装

    本文由秀依林枫提供友情赞助,首发于烂泥行天下. 为了能更好的利用服务器,所以打算把该业务进行迁移.因为该业务比较特殊,需要服务器上有相应的硬件支持,所以打算直接升级该服务器目前的操作系统.目前公司服务 ...

  4. iOS解决隐藏导航栏后,打开照片选择器后导航栏不显示的问题以及更换导航栏背景色

    问题描述: 遇到一种情况,在一个控制器上(隐藏了导航栏),打开照片选择器 UIImagePickerController后,照片选择器头部一片空白,且上滑相册时,信息会有错乱效果. 原因分析: 通过查 ...

  5. scalac error: bad option: '-make:transitive' on mvn package via command line

    1 问题描述: ubuntu环境下用eclipse+maven开发Scala的时候出现错误:scalac error: bad option: '-make:transitive' on mvn pa ...

  6. LINUX内核笔记:自旋锁

    目录 自旋锁作用与基本使用方法? 在SMP和UP上的不同表现? 自旋锁与上下文 使用spin_lock()后为什么不能睡眠? 强调:锁什么? 参考   1.自旋锁作用与基本使用方法? 与其他锁一样,自 ...

  7. Mac os下换行符导致发布到npm里的命令行模块不能使用问题

    学习node,弄一个命令行模块,发布到npm后,Windows安装后可以使用,但Mac 终端下则不行.对比grunt-cli搞了一夜,甚是郁闷,最后发现竟然是操作系统的换行符问题. npm insta ...

  8. 虚拟机centos6.5 --hadoop2.6集群环境搭建

    一.环境说明 虚拟机:virtualBox 系统:centos6.5,64位 集群:3个节点 master 192.168.12.232 slave01 192.168.12.233 slave02 ...

  9. Beyond IT

    Know Yourself <开讲啦> 20160306 潘建伟:探索的动机

  10. notepad++编译并运行java (自定义包)

    最近用Notepad++写汇编,感觉用起来挺顺手,于是想能不能也在这个优秀的编辑器下编写java并编译运行呢,因为每次启动eclipse都要挺长时间,而且eclipse实在太占内存了... 于是各种百 ...