数据

当前位置:永利皇宫463登录 > 数据 > 事务处理,中的回滚

事务处理,中的回滚

来源:http://www.makebuLuo.com 作者:永利皇宫463登录 时间:2019-09-12 14:31

全总回滚的法子1:展开 XACT_ABORT

--实施方案(二)

alter table tablename rename column old_column_name to new_column_name;
USE [TestDB]
GO
/****** 对象:  Table [dbo].[Person]    脚本日期: 11/23/2008 13:37:48 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Person](
    [PersonId] [nchar](18) NOT NULL,
    [PersonName] [nchar](20) NOT NULL,
 CONSTRAINT [PK_Person] PRIMARY KEY CLUSTERED 
(
    [PersonId] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

  set @iErrorCount=@iErrorCount+@@error  

  • Oracle:alter table table_name modify column_name datatype
  • SQL Server:alter table table_name alter column_name datatype

全体回滚方法2:使用Try...Catch

declare   @iErrorCount   int  

2.字符串条件
  SQL Server除了援助like关键字、“%”及“_”作为通配符以及选择escape关键字钦定转义字符进行模糊相配查询,还协助正则表明式中的方括号用法,以合营钦点范围内大概方括号所钦赐集结中的任性单个字符。
  SQL Server扶助的方括号用法有三种样式,[]与[^],前者用于包蕴有些字符,后面一个用于不满含有个别字符,比如如下。

最终要稳重的是:假使八个作业写了 Begin TransAction 而没写 Commit TransAction 或 Rollback TransAction 则相关操作的数量(只怕是表,可能是列,那自身还没测验。。。)会被锁住。。。而对此锁住的消除办法正是单独实践一下Commit TransAction 或 Rollback TransAction

  COMMIT TRAN Tran_2015_09_30 --实行专业

不过SQL Server要修必得运用表外号,且附带或不附带as都帮忙:

全部回滚方法3:自定义错误变量

--//参考:

SQL Server中贯彻收取表中的前n行,可以应用三种艺术:

Use TestDB
Begin Try
    Begin TransAction
        Insert Into Person(PersonId,PersonName)
                    Values('1','Name1')
        Insert Into Person(PersonId,PersonName)
                    Values('1','Name1')
        Insert Into Person(PersonId,PersonName)
                    Values('3','Name3')
    Commit TransAction
End Try
Begin Catch
    Rollback TransAction
End Catch
/*
    使用TryCatch来捕获异常。
    如果 TRY 块内生成的错误导致当前事务的状态失效,
    则将该事务归类为不可提交的事务。
    如果通常在 TRY 块外中止事务的错误在 TRY 内发生时,
    就会导致事务进入不可提交状态。
    不可提交的事务只能执行读操作或 ROLLBACK TRANSACTION。
    该事务不能执行任何可能生成写操作或 COMMIT TRANSACTION 的 Transact-SQL 语句。
    如果事务被分类为不可提交的事务,则 XACT_STATE 函数会返回值 -1。
*/

GO

select top 3 ename,sal from emp order by sal desc
except
select top 2 ename,sal from emp order by sal desc;
Use TestDB
Declare @tranError int -- 定义变量
Set @tranError=0
    Begin TransAction
        Insert Into Person(PersonId,PersonName)
                    Values('1','Name1')
            Set @tranError = @tranError + @@Error
        Insert Into Person(PersonId,PersonName)
                    Values('1','Name1')
            Set @tranError = @tranError + @@Error
        Insert Into Person(PersonId,PersonName)
                    Values('3','Name3')
            Set @tranError = @tranError + @@Error
    If @tranError = 0
        Commit TransAction
    Else
        Rollback TransAction
/*
    自定义一个变量来判断最后是否发生过错误。
*/

begin try
     begin tran Tran_2015_09_30
 
        insert into tb1(Id, c1) values(1,'1')
 
        insert into tb1(Id, c1) values(2,'2')
 
        insert into tb1(Id, c1) values('xxxx3','3')
 
        insert into tb1(Id, c1) values(4,'4')
 
        insert into tb1(Id, c1) values(5,'5')
 
    COMMIT TRAN Tran_2015_09_30
end try
begin catch
     raiserror 50005N'出错了'
     ROLLBACK TRAN Tran_2015_09_30  --回滚事务
end catch

7.null管理函数
  对应于Oracle的nvl()函数,SQL Server提供的null管理函数为isnull(),其用法与Oracle的nvl()同样。

默许情状下就算施行二个业务中现身错误,则只回滚错误操作语句(就是说那句不施行了,算不上回滚),错误处在此以前或未来的不错操作语句照旧会被交给。如:

  set @iErrorCount=@iErrorCount+@@error  

假定要询问排序后的第n航记录,能够由前n行结果除去前n-1行结果,如要查询emp表中sql值排行第三的笔录:

Use TestDB

Begin TransAction
    Insert Into Person(PersonId,PersonName)
                Values('1','Name1')
    Insert Into Person(PersonId,PersonName)
                Values('1','Name1')
    Insert Into Person(PersonId,PersonName)
                Values('3','Name3')
Commit TransAction
/*
    Select 一下 有'1','Name1'和'3','Name3',
    说明只有第二句的错误被取消了
*/

 

Use TestDB
SET XACT_ABORT ON -- 打开
Begin TransAction
    Insert Into Person(PersonId,PersonName)
                Values('1','Name1')
    Insert Into Person(PersonId,PersonName)
                Values('1','Name1')
    Insert Into Person(PersonId,PersonName)
                Values('3','Name3')
Commit TransAction
/*
    当 SET XACT_ABORT 为 ON 时,
    如果执行 Transact-SQL 语句产生运行时错误,
    则整个事务将终止并回滚。 
    默认情况下它是OFF状态。
*/

CREATE TABLE [dbo].[tb1](

#未使用别名
select ename from (select * from emp where deptno=20);
#使用别名
select ename from (select * from emp where deptno=20) e;

begin    

1.列别名
  除了扶助oracle的列表名语法情势之外,还援救把列外号置于列名从前,并附加等号:

 SQL Server 事务管理回滚事务  ;

select top 3 ename,sal from emp order by sal desc;

set @iErrorCount = 0  

①修改数据类型
  Oracle和SQL Server分别选取modify与alter column关键字修改列的数据类型,两个的语法为:

else  

6.null值在排序(order by)中的管理
  在SQL Server的查询中,要是order by附加了asc选项,即升序排序,则null值排在别的非空值以前;借使order by子句附加了desc,则null值排在别的非空值之后,也足以以为在SQL Server中,null值最小,那与Oracle的处理格局正好相反。

update [water].[dbo].[ErrorInf]
set ErrorMessage='test'
where ID=6

select * from dept where dname like '[0-9][0-9][a-z]%';

commit tran t1  ---提交事务

SQL Server不支持Oracle中的rownum关键字,而row_number()函数的用法与Oracle同样。
  相对于Oracle的贯彻情势,使用top n的用法,在SQL Server中得以很轻松地达成收取表中前n行的指标。如查询emp表中的sal值最高的前3条记下:

end

  • [amd]:表示满含a、m、d几个字符中的大肆一个
  • [^amd]:表示不分包a、m、d多少个字符中的任性叁个
  • [b-f]:表示西班牙语字母表中b到f之中的大肆三个
  • [0-9]:表示0到9那11个数字中的自便三个
      如查询dept表的dname列中的第一及第二字符为数字,第八个字符为小写韩语字母的记录,能够选拔如下语句:

--set XACT_ABORT ON   ---假使不安装该项为ON,在sql中默以为OFF,那么只只回滚发生错误的 Transact-SQL 语句;设为ON,回滚整个事情

8.修改表结构

end

select a.ename,a.sal from
(select top 3 ename,sal from emp order by sal desc) as a
except
select a.ename,a.sal from
(select top 2 ename,sal from emp order by sal desc) as a;

--创建表:

4.询问排序后的前n行或第n行记录

GO

select ename,sal+isnull(comm,0) from emp;

ON [PRIMARY]

select emp_name=ename,salary=sal from emp;

)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY] )

②退换列名
  Oracle使用alter table附加rename column子句来修改列名:

 

select ename from (select * from emp where deptno=20) e;
select ename from (select * from emp where deptno=20) as e;

begin tran Tran_2015_09_30

5.群集运算
  对与聚焦的差运算,Oracle使用minus运算符,而SQL Server使用except运算符。

if @iErrorCount=0

然则SQL不帮忙以下做法:

 

  • top n
  • row_number()

  set @iErrorCount=@iErrorCount+@@error  

3.多表连接
  对于本来连接,Oracle援助natural join以及using关键字的用法,而SQL Server不帮忙。
  在from子句中使用子查询时,Oracle使用或不行使表外号都以能够的。若采纳表别称,则不能够附带as关键字。如上面子查询:

  insert into tb1(Id, c1) values(2,'2')  

--实施方案(三)

GO

2. 代码泪 SQL Server 事务及回滚事务

  ROLLBACK TRAN Tran_2015_09_30 --回滚事务

 

GO

 

begin    

  insert into tb1(Id, c1) values(1,'1')  

     [Id] [int] NOT NULL,

 

SET XACT_ABORT ON  --语句发生运营时不当,则整个业务将适可而止并回滚。
Begin Tran
    INSERT INTO tb1(Id, c1) VALUES(1,'1')
    INSERT INTO tb1(Id, c1) VALUES('XX2','2') --此句发生错误时,就能回滚整个专业
Commit Tran

     [Id] ASC

     [c1] [nvarchar](50) NULL,

  1. EmanLee, Eman Lee's Space (blog, website)

CONSTRAINT [PK_Table1] PRIMARY KEY CLUSTERED

  set @iErrorCount=@iErrorCount+@@error  

GO

--实施方案(一)

  set @iErrorCount=@iErrorCount+@@error  

begin tran t1 ---运营多个作业

insert into [water].[dbo].[ErrorInf]([ID],ErrorMessage,[Description])
Values(1,'test1','test1')

  insert into tb1(Id, c1) values(5,'5')  

 

(

 

 

 

  insert into tb1(Id, c1) values(4,'4')  

  insert into tb1(Id, c1) values('xxxx3','3')  

     [c2] [datetime] NULL,

本文由永利皇宫463登录发布于数据,转载请注明出处:事务处理,中的回滚

关键词: