MSSQL 事务说明
前端之家收集整理的这篇文章主要介绍了
MSSQL 事务说明,
前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
1.什么是事务:事务是一个不可分割的工作逻辑单元,在数据库系统上执行并发操作时事务是做为最小的控制单元来使用的。他包含的所有数据库操作命令作为一个整体一起向系提交或撤消,这一组数据库操作命令要么都执行,要么都不执行。 2.事务的语句
开始事物:BEGIN TRANSACTION
提交事物:COMMIT TRANSACTION
回滚事务:ROLLBACK TRANSACTION
3.事务的4个属性
①原子性(Atomicity):事务中的所有元素作为一个整体提交或回滚,事务的个元素是不可分的,事务是一个完整操作。
②一致性(Consistemcy):事物完成时,数据必须是一致的,也就是说,和事物开始之前,数据存储中的数据处于一致状态。保证数据的无损。
③隔离性(Isolation):对数据进行修改的多个事务是彼此隔离的。这表明事务必须是独立的,不应该以任何方式以来于或影响其他事务。
④持久性(Durability):事务完成之后,它对于系统的影响是永久的,该修改即使出现系统故障也将一直保留,真实的修改了数据库
4.事务的保存点
SAVE TRANSACTION 保存点名称 --自定义保存点的名称和位置
ROLLBACK TRANSACTION 保存点名称 --回滚到自定义的保存点 -------------------实------------------例---------------------------- BEGIN TRANSACTION--开始事务 DECLARE @errorSun INT --定义错误计数器
SET @errorSun=0 --没错为0 UPDATE a SET id=232 WHERE a=1 --事务操作sql语句
SET @errorSun=@errorSun+@@ERROR --累计是否有错 UPDATE aa SET id=2 WHERE a=1 --事务操作sql语句
SET @errorSun=@errorSun+@@ERROR --累计是否有错 IF @errorSun<>0
BEGIN
PRINT '有错误,回滚'
ROLLBACK TRANSACTION--事务回滚语句
END
ELSE
BEGIN
PRINT '成功,提交'
COMMIT TRANSACTION--事务提交语句
END 示例:创建一个存储过程,向两个表中同时插入数据
<div class="codetitle"><a style="CURSOR: pointer" data="73977" class="copybut" id="copybut73977" onclick="doCopy('code73977')"> 代码如下:
<div class="codebody" id="code73977">
Create proc RegisterUser
(@usrName varchar(30),@usrPasswd varchar(30),@age int,@sex varchar(10),@PhoneNum varchar(20),@Address varchar(50) )
as begin
begin tran
insert into userinfo(userName,userPasswd) values(@usrName,@usrPasswd)
if @@error<>0
begin rollback tran return -1
end
insert into userdoc(userName,age,sex,PhoneNumber,Address)values(@Usrname,@age,@sex,@PhoneNum,@Address)
if @@error<>0
begin rollback tran
return -1
end commit tran
return 0
end
事务的
分类 按事务的启动与执行方式,可以将事务分为3类:
显示事务
也称之为
用户定义或
用户指定的事务,即可以显式地定义启动和结束的事务。分布式事务属于
显示事务
自动提交事务
默认事务管理模式。如果一个语句成功地完成,则提交该语句;如果遇到
错误,则回滚该语句。
隐性事务
当连接以此模式进行操作时,
sql将在提交或回滚当前事务后
自动启动新事务。无须描述事务的开始,只需提交或回滚每个事务。它
生成连续的事务链。 一、
显示事务
通过begin transacton、commit transaction、commit work、rollback transaction或rollback work等语句完成。
1、启动事务
格式:begin tran 事务名或变量 with mark 描述
2、结束事务
格式:commit tran 事务名或变量 (事务名与begin tran中的事务名一致
或commit work 但此没有参数
3、回滚事务
rollback tran 事务名或变量 | savepoint_name | savepoint_variable
或rollback work
说明:清除自事务的起点或到某个保存点所做的所有数据
修改 4、在事务内设置保存点
格式:save tran savepoint_name | savepoint_variable
示例:
<div class="codetitle">
<a style="CURSOR: pointer" data="65691" class="copybut" id="copybut65691" onclick="doCopy('code65691')"> 代码如下:
<div class="codebody" id="code65691">
use bookdb
go
begin tran mytran
insert into book
values(9,"windows2000',1,22,'出版社')
save tran mysave
delete book where book_id=9
rollback tran mysave
commit tran
go
select
from book
go
可以知道,上面的语句执行后,在book中插入了一笔记录,而并没有
删除。因为使用rollback tran mysave 语句将操作回滚到了
删除前的保存点处。
5、
标记事务
格式:with mark
例:使用
数据库标记将日志恢复到预定义时间点的语句
在事务日志中置入一个
标记。请注意,被
标记的事务至少须提交一个更新,以
标记该日志。 BEGIN TRAN MyMark WITH MARK
UPDATE pubs.dbo.LastLogMark SET MarkTime = GETDATE()
COMMIT TRAN MyMark 按照您常用的
方法备份事务日志。 BACKUP LOG pubs TO DISK='C:\Backups\Fullbackup.bak' WITH INIT 现在您可以将
数据库恢复至日志
标记点。首先恢复
数据库,并使其为接受日志恢复做好准备。 RESTORE DATABASE pubs FROM DISK=N'C:\Backups\Fullbackup.bak' WITH NORECOVERY 现在将日志恢复至包含该
标记的时间点,并使其可供使用。请注意,STOPAT在
数据库正在执行大容量日志时
禁止执行。 RESTORE LOG pubs FROM DISK=N'C:\Backups\Logbackup.bak' WITH RECOVERY,
STOPAT='02/11/2002 17:35:00' 5、不能用于事务的操作
创建
数据库 create database
修改数据库 alter database
删除数据库 drop database
恢复
数据库 restore database
加载
数据库 load database
备份日志
文件 backup log
恢复日志
文件 restore log
更新
统计数据 update statitics
授权操作 grant
复制事务日志 dump tran
磁盘初始化 disk init
更新使用sp_configure后的系统配置 reconfigure 二、
自动提交事务
sql连接在begin tran 语句启动显式事务,或隐性事务模式设置为打开之前,将以
自动提交模式进行操作。当提交或回滚显式事务,或者
关闭隐性事务模式时,将返回到
自动提交模式。
示例:
由于编译
错误,使得三个insert都没执行
<div class="codetitle">
<a style="CURSOR: pointer" data="43665" class="copybut" id="copybut43665" onclick="doCopy('code43665')"> 代码如下:
<div class="codebody" id="code43665">
use test
go
create table testback(cola int primary key,colb char(3))
go
insert into testback values(1,'aaa')
insert into testback values(2,'bbb')
insert into testback value(3,'ccc')
go
select from testback
go
没有任何结果返回 三、隐式事务
通过 API
函数或 Transact-
sql SET IMPLICIT_TRANSACTIONS ON 语句,将隐性事务模式设置为打开。下一个语句
自动启动一个新事务。当该事务完成时,再下一个 Transact-
sql 语句又将启动一个新事务。
当有大量的DDL 和DML命令执行时会
自动开始,并一直保持到
用户明确提交为止,切换隐式事务可以用SET IMPLICIT_TRANSACTIONS
为连接设置隐性事务模式.当设置为 ON 时,SET IMPLICIT_TRANSACTIONS 将连接设置为隐性事务模式。当设置为 OFF 时,则使连接返回到
自动提交事务模式
语句
包括:
alter table insert open create delete revoke drop
select fetch truncate table grant update
示例:
下面使用显式与隐式事务。它使用@@tracount
函数演示打开的事务与
关闭的事务:
<div class="codetitle">
<a style="CURSOR: pointer" data="83185" class="copybut" id="copybut83185" onclick="doCopy('code83185')"> 代码如下:
<div class="codebody" id="code83185"> begin tran
declare @rownum1 int --未
添加订单的空房数
declare @rownum2 int --
添加订单的空房数目
declare @BookID1 int
set @BookID1=0
insert into T_BookRoomInfo(RoomID,CustomerName,CustomerCardID,Discount,
EnterTime,DepositMoney,Memo,UserID,UpdTime)
values (@RoomID,@CustomerName,@CustomerCardID,@Discount,
getdate(),@DepositMoney,@Memo,@UserID,getdate())
select @BookID1=@@IDENTITY
if(@BookID1<>0)
begin
select @rownum1=count(1)
from T_Room
where IsEmploy=0
update T_Room
set IsEmploy=1
where RoomID=@RoomID
select @rownum1=count(1)
from T_Room
where IsEmploy=0
if(@rownum1<=@rownum2)
begin
rollback tran
end
else
begin
commit tran
end
end
else
begin
rollback tran
end