SQL Server 事务说明
2022-11-12 09:52:05
内容摘要
这篇文章主要为大家详细介绍了SQL Server 事务说明,具有一定的参考价值,可以用来参考一下。
对此感兴趣的朋友,看看idc笔记做的技术笔记!1.什么是事务:事务是一个不可分割的工作
文章正文
这篇文章主要为大家详细介绍了SQL Server 事务说明,具有一定的参考价值,可以用来参考一下。
对此感兴趣的朋友,看看idc笔记做的技术笔记!
1.什么是事务:事务是一个不可分割的工作逻辑单元,在数据库系统上执行并发操作时事务是做为最小的控制单元来使用的。他包含的所有数据库操作命令作为一个整体一起向系提交或撤消,这一组数据库操作命令要么都执行,要么都不执行。2.事务的语句开始事物:BEGIN TRANSACTION提交事物:COMMIT TRANSACTION回滚事务:ROLLBACK TRANSACTION3.事务的4个属性①原子性(Atomicity):事务中的所有元素作为一个整体提交或回滚,事务的个元素是不可分的,事务是一个完整操作。②一致性(Consistemcy):事物完成时,数据必须是一致的,也就是说,和事物开始之前,数据存储中的数据处于一致状态。保证数据的无损。③隔离性(Isolation):对数据进行修改的多个事务是彼此隔离的。这表明事务必须是独立的,不应该以任何方式以来于或影响其他事务。④持久性(Durability):事务完成之后,它对于系统的影响是永久的,该修改即使出现系统故障也将一直保留,真实的修改了数据库4.事务的保存点SAVE TRANSACTION 保存点名称 --自定义保存点的名称和位置ROLLBACK TRANSACTION 保存点名称 --回滚到自定义的保存点-------------------实------------------例----------------------------BEGIN TRANSACTION--开始事务DECLARE @errorSun INT --定义错误计数器SET @errorSun=0 --没错为0UPDATE 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<>0BEGINPRINT '有错误,回滚'ROLLBACK TRANSACTION--事务回滚语句ENDELSEBEGINPRINT '成功,提交'COMMIT TRANSACTION--事务提交语句END示例:创建一个存储过程,向两个表中同时插入数据代码如下:
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示例:
代码如下:
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 MARKUPDATE 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都没执行
代码如下:
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 dropselect fetch truncate table grant update示例:下面使用显式与隐式事务。它使用@@tracount函数演示打开的事务与关闭的事务:
代码如下:
use test
go
set nocount on
create table t1(a int)
go
insert into t1 values(1)
go
print '使用显式事务'
begin tran
insert into t1 values(2)
print '事务外的事务数目:'+cast(@@trancount as char(5))
commint tran
print '事务外的事务数目:'+cast(@@trancount as char(5))
go
print
go
set implicit_transactions on
go
print '使用隐式事务'
go
insert into t1 values*4)
print'事务内的事务数目:'+cast(@@trancount as char(5))
commint tran
print'事务外的事务数目:'+cast(@@trancount as char(5))
go
执行结果:使用显示事务事务内的事务数目:2事务外的事务数目:1使用隐式事务事务内的事务数目:1事务外的事务数目:0四、分布式事务跨越两个或多个数据库的单个sql server中的事务就是分布式事务。与本地事务区别:必须由事务管理器管理,以尽量避免出现因网络故障而导致一个事务由某些资源管理器成功提交,但由另一些资源管理器回滚的情况。sql server 可以由DTc microsoft distributed transaction coordinator 来支持处理分布式事务,可以使用 BEgin distributed transaction 命令启动一个分布式事务处理分二阶段:A 准备阶段B 提交阶段执行教程:1、sql 脚本或应用程序连接执行启动分布式事务的sql语句2、执行该语句的sql在为事务中的主控服务器3、脚本或应用程序对链接的服务器执行分布式查询,或对远程服务器执行远程存储过程。4、当执行了分布式查询或远程过程调用后,主控服务器将自动调用msdtc以便登记分布式事务中链接的服务器和远程服务器5、当脚本或应用程序发出commit或rollback语句时,主控sql将调用msdtc管理两阶段提交过程,或者通知链接的服务器和远程服务器回滚其事务。mssql 事务的一个例子
代码如下:
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
注:关于SQL Server 事务说明的内容就先介绍到这里,更多相关文章的可以留意
代码注释