CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  MS-SQL Server >  基础类

关于事务的问题,如能帮忙,全分相送~~~在线等

楼主NicK1986(隨風)2005-04-04 09:43:20 在 MS-SQL Server / 基础类 提问

为什么要用事务,事务与批处理、存储过程有什么区别????? 问题点数:70、回复次数:4Top

1 楼jinjazz(近身剪)回复于 2005-04-04 09:46:05 得分 0

zt~~  
   
  -----  
  CREATE   FUNCTION   FunMergeCharField(@vchA   varchar(6))  
  RETURNS   nvarchar(4000)  
  AS  
  BEGIN  
  DECLARE   @r   nvarchar(4000)  
  SET   @r=''  
  SELECT   @r=@r+','+ygname   FROM   表   WHERE   bmId=@vchA    
  RETURN(substring(@r,2,4000))    
         
  --RETURN   @r  
  ENDTop

2 楼jinjazz(近身剪)回复于 2005-04-04 09:46:35 得分 20

昏,没有copy过来,,  
  转贴  
  --  
  *******事务全攻略******  
   
  一   事务的属性  
   
  事务具有ACID属性  
  即   Atomic原子性,   Consistent一致性,   Isolated隔离性,   Durable永久性  
   
  原子性  
       
        就是事务应作为一个工作单元,事务处理完成,所有的工作要么都在数据库中保存下来,要么完全  
  回滚,全部不保留  
   
   
  一致性  
        事务完成或者撤销后,都应该处于一致的状态  
   
  隔离性  
   
        多个事务同时进行,它们之间应该互不干扰.应该防止一个事务处理其他事务也要修改的数据时,  
  不合理的存取和不完整的读取数据  
   
   
  永久性  
        事务提交以后,所做的工作就被永久的保存下来  
   
   
  二   事务并发处理会产生的问题    
   
  丢失更新  
   
          当两个或多个事务选择同一行,然后基于最初选定的值更新该行时,会发生丢失更新问题、  
  每个事务都不知道其它事务的存在。最后的更新将重写由其它事务所做的更新,这将导致数据丢失。  
   
  脏读  
            当第二个事务选择其它事务正在更新的行时,会发生未确认的相关性问题。  
            第二个事务正在读取的数据还没有确认并且可能由更新此行的事务所更改。  
   
  不可重复读  
   
            当第二个事务多次访问同一行而且每次读取不同的数据时,会发生不一致的分析问题。  
            不一致的分析与未确认的相关性类似,因为其它事务也是正在更改第二个事务正在读取的数据。  
            然而,在不一致的分析中,第二个事务读取的数据是由已进行了更改的事务提交的。而且,不一致的分析涉及多次(两次或更多)读取同一行,而且每次信息都由其它事务更改;因而该行被非重复读取。  
   
  幻像读  
   
              当对某行执行插入或删除操作,而该行属于某个事务正在读取的行的范围时,会发生幻像读问题。  
              事务第一次读的行范围显示出其中一行已不复存在于第二次读或后续读中,因为该行已被其它事务删除。同样,由于其它事务的插入操作,事务的第二次或后续读显示有一行已不存在于原始读中。  
   
   
  三   事务处理类型  
   
   
  自动处理事务  
   
        系统默认每个T-SQL命令都是事务处理     由系统自动开始并提交  
   
   
  隐式事务  
   
          当有大量的DDL   和DML命令执行时会自动开始,并一直保持到用户明确提交为止,切换隐式事务可以用SET   IMPLICIT_TRANSACTIONS  
          为连接设置隐性事务模式.当设置为   ON   时,SET   IMPLICIT_TRANSACTIONS   将连接设置为隐性事务模式。当设置为   OFF   时,则使连接返回到自动提交事务模式  
   
   
  用户定义事务  
   
            由用户来控制事务的开始和结束     命令有:   begin   tran   commit   tran     rollback   tran   命令  
   
   
  分布式事务  
            跨越多个服务器的事务称为分布式事务,sql   server   可以由DTc   microsoft   distributed   transaction   coordinator  
            来支持处理分布式事务,可以使用   BEgin   distributed   transaction   命令启动一个分布式事务处理  
   
   
   
  四     事务处理的隔离级别  
   
  使用SET   TRANSACTION   ISOLATION   LEVEL来控制由连接发出的所有语句的默认事务锁定行为  
   
  从低到高依次是  
   
   
  READ   UNCOMMITTED  
   
  执行脏读或   0   级隔离锁定,这表示不发出共享锁,也不接受排它锁。当设置该选项时,可以对数据执行未提交读或脏读;在事务结束前可以更改数据内的数值,行也可以出现在数据集中或从数据集消失。该选项的作用与在事务内所有语句中的所有表上设置   NOLOCK   相同。这是四个隔离级别中限制最小的级别。  
   
  举例  
   
  设table1(A,B,C)  
  A         B         C  
  a1       b1       c1  
  a2       b2       c2  
  a3       b3       c3  
   
  新建两个连接  
  在第一个连接中执行以下语句  
  select   *   from   table1  
  begin   tran  
  update   table1   set   c='c'  
  select   *   from   table1  
  waitfor   delay   '00:00:10'     --等待10秒  
  rollback   tran  
  select   *   from   table1  
   
  在第二个连接中执行以下语句  
  SET   TRANSACTION   ISOLATION   LEVEL   READ   UNCOMMITTED  
  print   '脏读'  
  select   *   from   table1  
  if   @@rowcount>0  
  begin  
    waitfor   delay   '00:00:10'    
    print   '不重复读'  
    select   *   from   table1  
  end  
   
  第二个连接的结果  
   
  脏读  
  A         B         C  
  a1       b1       c  
  a2       b2       c  
  a3       b3       c  
   
  '不重复读'  
  A         B         C  
  a1       b1       c1  
  a2       b2       c2  
  a3       b3       c3  
   
   
   
  READ   COMMITTED  
   
  指定在读取数据时控制共享锁以避免脏读,但数据可在事务结束前更改,从而产生不可重复读取或幻像数据。该选项是   SQL   Server   的默认值。  
   
   
  在第一个连接中执行以下语句  
  SET   TRANSACTION   ISOLATION   LEVEL   READ   COMMITTED  
  begin   tran  
  print   '初始'  
  select   *   from   table1  
  waitfor   delay   '00:00:10'     --等待10秒  
  print   '不重复读'  
  select   *   from   table1  
  rollback   tran  
   
   
  在第二个连接中执行以下语句  
  SET   TRANSACTION   ISOLATION   LEVEL   READ   COMMITTED  
   
  update   table1   set   c='c'  
       
   
  第一个连接的结果  
   
  初始  
  A         B         C  
  a1       b1       c1  
  a2       b2       c2  
  a3       b3       c3  
   
  不重复读  
  A         B         C  
  a1       b1       c  
  a2       b2       c  
  a3       b3       c  
   
   
   
  REPEATABLE   READ  
   
  锁定查询中使用的所有数据以防止其他用户更新数据,但是其他用户可以将新的幻像行插入数据集,且幻像行包括在当前事务的后续读取中。因为并发低于默认隔离级别,所以应只在必要时才使用该选项。  
   
   
  在第一个连接中执行以下语句  
  SET   TRANSACTION   ISOLATION   LEVEL   REPEATABLE   READ  
  begin   tran  
  print   '初始'  
  select   *   from   table1  
  waitfor   delay   '00:00:10'     --等待10秒  
  print   '幻像读'  
  select   *   from   table1  
  rollback   tran  
   
   
  在第二个连接中执行以下语句  
  SET   TRANSACTION   ISOLATION   LEVEL   REPEATABLE   READ  
  insert     table1   select   'a4','b4','c4'  
   
   
  第一个连接的结果  
   
  初始  
  A         B         C  
  a1       b1       c1  
  a2       b2       c2  
  a3       b3       c3  
   
  幻像读  
  A         B         C  
  a1       b1       c1  
  a2       b2       c2  
  a3       b3       c3  
  a4       b4       c4  
   
   
  SERIALIZABLE  
   
  在数据集上放置一个范围锁,以防止其他用户在事务完成之前更新数据集或将行插入数据集内。这是四个隔离级别中限制最大的级别。因为并发级别较低,所以应只在必要时才使用该选项。该选项的作用与在事务内所有   SELECT   语句中的所有表上设置   HOLDLOCK   相同。  
   
   
  在第一个连接中执行以下语句  
  SET   TRANSACTION   ISOLATION   LEVEL   SERIALIZABLE  
  begin   tran  
  print   '初始'  
  select   *   from   table1  
  waitfor   delay   '00:00:10'     --等待10秒  
  print   '没有变化'  
  select   *   from   table1  
  rollback   tran  
   
   
  在第二个连接中执行以下语句  
  SET   TRANSACTION   ISOLATION   LEVEL   SERIALIZABLE  
  insert     table1   select   'a4','b4','c4'  
   
   
  第一个连接的结果  
   
  初始  
  A         B         C  
  a1       b1       c1  
  a2       b2       c2  
  a3       b3       c3  
   
  没有变化  
  A         B         C  
  a1       b1       c1  
  a2       b2       c2  
  a3       b3       c3  
   
   
  五   事务处理嵌套的语法和对@@TRANCOUNT的影响  
   
  BEGIN   TRAN     @@TRANCOUNT+1  
  COMMIT   TRAN   @@TRANCOUNT-1  
  ROLLBACK   TRAN   使@@TRANCOUNT回归0  
  SAVE   TRAN   不影响@@TRANCOUNT  
   
  举例  
  1)  
   
  SELECT   '事务处理前',   @@TRANCOUNT             --值为   0  
  BEGIN   TRAN  
      SELECT   '第一个事务',   @@TRANCOUNT         --值为   1  
          SELECT   *   FROM   table1  
          BEGIN   TRAN    
                SELECT   '第二个事务',   @@TRANCOUNT     --值为   2  
                    DELETE   table1  
          COMMIT   TRAN  
          SELECT   '递交第二个事务',   @@TRANCOUNT   --值为   1  
  ROLLBACK   TRAN  
  SELECT   '回滚第一个事务',   @@TRANCOUNT   --值为   0  
   
   
  2)  
  SELECT   '事务处理前',   @@TRANCOUNT             --值为   0  
  BEGIN   TRAN    
      SELECT   '第一个事务',   @@TRANCOUNT         --值为   1  
          SELECT   *   FROM   table1  
      SAVE   TRAN   t1  
      SELECT   '保存第一个事务后',   @@TRANCOUNT   --值为   1    
          BEGIN   TRAN    
                SELECT   '第二个事务',   @@TRANCOUNT     --值为   2  
                    DELETE   table1  
        ROLLBACK   TRAN   t1  
          SELECT   '回滚到保存点t1',   @@TRANCOUNT   --注意这里的值为   2    
  IF   @@TRANCOUNT>0  
  ROLLBACK   TRAN  
  SELECT   '处理结束',   @@TRANCOUNT   --为   0  
   
   
  SET   XACT_ABORT  
  控制语句产生运行时错误时,是否自动回滚当前事务  
   
  比如  
   
  SET   XACT_ABORT   ON  
  BEGIN   TRAN  
      SELECT   *   FROM   一个不存在的表  
  ROLL   BACKTRAN  
  PRINT   '处理完毕'     --执行结果没有到这一步  
  go  
  SELECT   @@TRANCOUNT     --值为1   产生孤立事务  
   
   
  六   事务调试语句  
  DBCC   OPENTRAN  
   
  如果在指定数据库内存在最旧的活动事务和最旧的分布和非分布式复制事务,则显示与之相关的信息  
  示例  
  下例获得当前数据库和   pubs   数据库的事务信息。  
   
  --   Display   transaction   information   only   for   the   current   database.  
  DBCC   OPENTRAN  
  GO  
  --   Display   transaction   information   for   the   pubs   database.  
  DBCC   OPENTRAN('pubs')  
  GO  
   
   
  补充:有关孤立事务请参见  
   
  全接触SQL异常与孤立事务  
  http://expert.csdn.net/Expert/topic/1675/1675986.xml?temp=.6820337  
  Top

3 楼NicK1986(隨風)回复于 2005-04-04 10:13:47 得分 0

大哥,我是问事务与批处理、存储过程有什么区别?????  
  不是问什么是事务  
  Top

4 楼ningmeng3000(柠檬)回复于 2005-04-06 17:26:31 得分 50

自己回去看一下SQL自带的哪个联机丛书文档阿  
  Top

相关问题

  • 关于事务的问题********在线等候、答者有分*****
  • 分布式事务问题
  • 分布式事务问题
  • 关于事务100分
  • 关于事务的一个简单问题****在线等候答对给分*****
  • MSserver 7.0分布式事务(跨域,服务器通过有线网连接)?
  • 一个关于MTS/COM+的事务和并发问题 200分相送
  • 一个关于MTS/COM+的事务和并发问题 200分相送
  • com+事务和ADO.NET事务100分!欢迎讨论
  • 事务的问题,再线等待!!

关键词

  • 语句
  • 数据
  • 连接
  • 执行
  • 选项
  • 分布式
  • 事务
  • 事务处理
  • 读取
  • trancount

得分解答快速导航

  • 帖主:NicK1986
  • jinjazz
  • ningmeng3000

相关链接

  • SQL Server类图书

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo