SQL Server 数据库的维护(三)__事务(transaction)和锁
--维护数据库--
--事务(transaction)和锁--
--事务(transaction)--
--概述:
事务是指封装了一组T-SQL语句的单个逻辑单元。单元中的所有语句作为一个整体,在满足一定条件时全部执行(提交事务),或因不满足条件而全部不执行(回滚事务)。
在同一数据库中的数据在操作时可能是相互影响的,如果数据再互相影响的操作中发生,可以使用事务解决。
--事务的属性:事务的定义(声明)、执行(提交)、撤销(回滚)操作一旦发生,必须满足四个属性,即ACID属性。
1)原子性:事务作为一个独立的逻辑单元,被称为原子单元。它的执行是一次性的,要么事务中的所有事件都完成,要么不执行事务中的任何事件。
2)一致性:事务提交或回滚操作成功执行后,所有数据必须保持从一种状态到另一种状态的一致性。
3)隔离性:并发事务的修改必须与其他并发事务所做的修改隔离。一个事务执行时不可以看到另一个事务执行的中间阶段。
4)持久性:事务提交或回滚操作成功执行后,该结果对于系统的响应是永久的,无论之后发生任何事件。
--分类:根据数据库中发生事件的逻辑功能的不同,可以使用不同类型的事务完成对数据库中数据的维护。事务可以分显式事务、隐式事务和自动提交事务三种类型。
1)自动提交事务。是数据库的默认事务管理模式。每一个T-SQL语句都作为一个独立的事务发生。如果语句成功执行,则提交该语句;如果执行遇到错误,则回滚该语句。只要没有声明显式事务或隐式事务,那么数据库的实际连接就此默认模式操作。
2)隐式事务。指不需要描述事务的开始,只需要指明何时提交或回滚事务即可。若想使用隐式事务,可以使用set implicit_transaction on语句开启隐式事务模式,在隐式事务使用完毕后,再用set implicit_transaction off语句关闭隐式事务模式即可。当隐式事务模式开启后,首次执行以下任何语句时,都会自动启动一个事务:create、alter、drop、select、insert、update、delete、truncate、open、fetch、grant、revoke。在发生COMMIT或ROLLBACK语句之前,该事务将一直保持有效。在第一个事务被提交或回滚之后,下次当连接执行以上任何语句时,数据库引擎实例都将自动启动一个新事务。该模式将不断的生成隐性事务链,直到隐式事务模式关闭为止。
3)显式事务。指表明了事物的开始和结束的事务。事务以beigin transaction语句开始,以commit transaction或rollback transaction语句结束。
--事务的操作流程
显式事务的主要操作流程:
1)开始事务:begin transaction [事务名称]
--使用该语句标识一个事务的开始,全局变量@@transaction的值递增1,可以用来判断事务执行的结果状态。允许开始事务是不指定事务名称。transaction可简写为tran。
2)提交事务:commit transaction [事务名称]
--如果事务中的语句执行时没有遇到错误,可以使用该语句成功提交事务。事务中对数据库的操作有效执行,事务占有的资源被释放。可以不指定事务名称,以提交与之配对的begin transaction开始的事务。transaction可简写为tran。
3)回滚事务:rollback transaction [事务名称]
--如果事务中的语句执行时遇到错误,可以使用该语句清除遇到的事务,所有数据返回到事务开始时的状态。事务占用的资源被释放。可以不指定事务名称,以回滚与之配对的begin transaction开始的事务。transaction可简写为tran。
例1:(***下面是一个帮助理解的案例***) 在“账户表”中完成从张三账户中转出100元到道李四账户的转账操作,要求账户不能透支。如果产生透支的情况,打印“转账失败!”的错误提示,同时撤销转账事件;如果转账操作没有错误,打印出“转账成功!”提示,同时显示转账后信息。 "账户表"转账前 "账户表"转账后 ────┬──── ────┬──── 姓名 余额 姓名 余额 ────┼──── ────┼──── 张三 1100 张三 100 ────┼──── ────┼──── 李四 200 李四 1200 ────┴──── ────┴──── 分析:为避免账户余额透支,为“余额”字段设置check约束“余额>=0”,执行从张三账户转出金额给李四的操作实质是修改:账户表:,给张三金额减1000元,给李四金额加1000元。 可以把修改操作封装到事务中,再通过判断修改操作是否存在错误,决定事务提交或回滚。 set nocount on print '=====转账前金额=====' select*from账户表 go begin tran --开始事务 declare @serror int set @serror=0 update 账户表 set 余额=余额-1000 where 姓名='张三' set @serror=@serror+@@ERROR --全局变量用来统计最后一次T-SQL语句操作是否有误,如有返回错误代码,如无返回0。 update 账户表 set 余额=余额+1000 where 姓名='李四' set @serror=@serror+@@ERROR if @serror<>0 begin rollback tran --回滚事务 print '转账失败!' end else begin commit tran --提交事务 print '转账成功!' end go print '=====转账后金额=====' select*from 账户表 go set nocount off 附:("账户表"数据库 T-SQl语句) --建立"账户表"数据库-- create database 账户表 on(name='账户表_m', filename='D:\账户表_m.mdf', size=3mb,filegrowth=1mb,maxsize=unlimited) log on(name='账户表_l', filename='D:\账户表_l.ldf', size=1,filegrowth=10%,maxsize=unlimited) go --为数据库"账户表"建立数据表"账户表" use 账户表 go create table 账户表 (姓名 nvarchar(5)not null primary key, 余额 decimal(18, 0)not null ) --为数据表"账户表"添加数据 insert 账户表 values('张三',1100) insert 账户表 values('李四',200) --为数据表“账户表”设置检查约束 alter table 账户表 add constraint CK_账户表_余额 --添加约束 check (余额>=0) 例2:(从“商品管理数据库”的“客户信息表”中删除客户编号为20130001的客户记录。删除后给出提示信息,并显示删除后的“客户信息表”中的记录) use 商品管理数据库 go set nocount on print '=====原客户信息表=====' select*from 客户信息表 go begin tran declare @serror int set @serror=0 delete 客户信息表 where 客户编号='' set @serror=@serror+@@ERROR if @serror<>0 begin rollback tran print '删除客户失败!' end else begin commit tran print '删除客户成功!' end go print '=====原客户信息表=====' select*from 客户信息表 go set nocount off
理解例子
--锁--
SQL Server中的锁用来控制一个事务与另一个事务并发性。系统会自动为被访问的资源设置或释放锁。
如果某个事务已锁定一个资源,而另一个事务要访问该资源,那么SQL Server会根据第一个事务所使用的锁模式的兼容性来确定是否授予第二个锁。
资源的锁定模式可分为: 意向共享(IS)、共享(S)、更新(U)、意向排他(IX)、意向排他共享(SIX)和排他(X)六种模式。
常用锁模式矩阵:(YES不冲突,NO冲突)
请求的锁模式 | IS | S | U | IX | SIX | X |
IS | YES | YES | YES | YES | YES | NO |
S | YES | YES | YES | NO | NO | NO |
U | YES | YES | NO | NO | NO | NO |
IX | YES | NO | NO | YES | NO | NO |
SIX | YES | NO | NO | NO | NO | NO |
X | NO | NO | NO | NO | NO | NO |
Microsoft SQL Server 中完整的锁兼容性矩阵:(参考)
死锁现象:在多个任务中,如果一个任务锁定了其他任务试图锁定的资源,此时会造成任务的永久阻塞,从而出现死锁现象。
除非某个外部进程断开死锁,否则死锁中的两个事务都将无限期等待下去。
注:"--"可看成说明或者注释文本
SQL Server 数据库的维护(三)__事务(transaction)和锁的更多相关文章
- SQL Server 数据库的维护(一)__存储过程(procedure)
--维护数据库-- --存储过程(procedure)-- --概述: SQl Serve的存储过程是由一个或多个T-SQL语句组成的一个集合.常用的程序代码段通常被创建成存储过程,一次创建多次调用, ...
- SQL Server 数据库的维护(二)__触发器
--维护数据库-- --触发器-- --概述: 触发器是一种特殊类型的存储过程,用来强制执行业务规则.在调用执上,触发器不能像存储过程那样可以由用户通过T-SQL语句直接调用,而是需要有数据库所发生的 ...
- SQL Server 数据库的维护(四)__游标(cursor)
--维护数据库-- --游标(cursor)-- --概述: 注:使用select语句查询结果的结果集是一个整体,如果想每次处理一行或一部分行数据,游标可以提供这种处理机制.可以将游标理解为指针.指针 ...
- SQL SERVER 数据库备份的三种策略及语句
1.全量数据备份 备份整个数据库,恢复时恢复所有.优点是简单,缺点是数据量太大,非常耗时 全数据库备份因为容易实施,被许多系统优先采用.在一天或一周中预定的时间进行全数据库备份使你不用动什么脑筋 ...
- 查看sql server数据库连接数的三种方法
怎样才能查看sql server数据库连接数呢?下面就将为您介绍三种查看的方法,供您参考,希望能够帮助到您. 1.通过系统的“性能”来查看:开始->管理工具->性能(或者是运行里面输入 m ...
- SQL Server - 数据库初识
在互联网笔试中,常遇到数据库的问题,遂来简单总结,注意,以 Sql Server 数据库为例. 数据库 数据库系统,Database System,由数据库和数据库管理系统组成. 数据库,Data ...
- sql server数据库中char,varchar,nvarchar字段的区别
Char,varchar,nvarchar字段是sql server数据库中的三种字段类型.好多人在选择存储的时候不知道如何抉择,我给大家讲下这个三个字段类型的区别. Char(n)是长度为n个字节的 ...
- 第三篇——第二部分——第五文 配置SQL Server镜像——域环境SQL Server镜像日常维护
本文接上面两篇搭建镜像的文章: 第三篇--第二部分--第三文 配置SQL Server镜像--域环境:http://blog.csdn.net/dba_huangzj/article/details/ ...
- SQL Server数据库的三种恢复模式:简单恢复模式、完整恢复模式和大容量日志恢复模式(转载)
SQL Server数据库有三种恢复模式:简单恢复模式.完整恢复模式和大容量日志恢复模式: 1.Simple 简单恢复模式, Simple模式的旧称叫”Checkpoint with truncate ...
随机推荐
- asp.net动态设置标题title 关键字keywords 描述descrtptions
推荐的简单做法如下: protected void Page_Load(object sender, EventArgs e){//Page titlePage.Title = "This ...
- 小表驱动大表, 兼论exists和in
给出两个表,A和B,A和B表的数据量, 当A小于B时,用exists select * from A where exists (select * from B where A.id=B.id) ex ...
- http 301 和 302 的区别!
1.什么是301转向?什么是301重定向? 301转向(或叫301重定向,301跳转)是当用户或搜索引擎向网站服务器发出浏览请求时,服务器返回的HTTP数据流中头信息(header)中的状态码的一种, ...
- Spring MVC4 纯注解配置教程
阅读本文需要又一定的sping基础,最起码要成功的运行过一个SpringMvc项目. 在传统的Spring项目中,我们要写一堆的XML文件.而这些XML文件格式要求又很严格,很不便于开发.而网上所谓的 ...
- mfc MemoryAdressRead
内涵图 address
- [Mongdb] 关于Replica Set复制集奇数成员限制的解释--待完善
一.缘由: http://blog.itpub.net/29254281/viewspace-1176821/ http://blog.chinaunix.net/uid-20726500-id-54 ...
- 同时使用Junit4的@Parameterized参数化测试和Spring容器
转载:http://www.jianshu.com/p/d191fe54915f 整合Spring容器 @SpringApplicationConfiguration(classes = Applic ...
- 【转】EXCEL不显示科学计数法
源地址:http://jingyan.baidu.com/article/e4d08ffdcc304e0fd3f60d69.html 2法无效,不知道为何
- $(window).height()获取浏览器高度不准
以前在开发的时候这样$(window).height()获取浏览器的高度一致不觉得有什么不对, 今天在做java开发的时候不知道为什么获取的高度很明显不对. 后来无意中想到一个文档模式不对的原因,于是 ...
- Python基础篇【第8篇】: Socket编程(二)SocketServer
SocketServer 在上一篇文章中我们学习了利用socket模块创建socket通信服务,但细心学习后就会发现利用socket模块创建的服务无法进行多进程的处理,当需要进行大量请求处理时,请求就 ...