1.显示事务
它是通过 BEGIN TRANSACTION 、 COMMIT TRANSACTION 、ROLLBACK TRANSACTION 、 SAVE TRANSACTION 等Transact-SQL语句来完成的。
use test
go
/*启动一个事务向student表中插入一个记录*/
begin transaction
insert into student values(100,'陈浩','男',19)
commit tran
select * from student
go
回滚事务: ROLLBACK TRANSACTION 。例如:
/*启动一个事务向student表中删除一个记录,然后回滚该事务*/
begin transaction
delete student where sno=100
rollback
select * from student --由于回滚该事务,因此student表中没有插入记录。
go
在事务内设置保存点: SAVE TRANSACTION 。 保存点是如果有条件的取消事务的一部分,事务可以返回的位置。例如:
/*在事务内设置保存点*/
begin transaction mytran --启动事务
select * from student
save transaction s1 --设置保存点。
insert into student values(200,'王洪','男',22) --插入另一个学生的记录
rollback transaction s1 --事务回滚到保存点s1
commit transaction
go
select * from student --陈浩插入到表中而王洪没有插入到表中
操作 | 相应的SQL语句 |
创建数据库 | CREATE DATABASE |
修改数据库 | ALTER DATABASE |
删除数据库 | DROP DATABASE |
恢复数据库 | RESTORE DATABASE |
加载数据库 | LOAD DATABASE |
备份日志文件 | BACKUP LOG |
恢复日志文件 | RESTORE LOG |
更新统计数据 | UPDATE STATISTICS |
授权操作 | GRANT |
复制事务日志 | DUMP TRANSACTION |
磁盘初始化 | DISK INIT |
更新使用sp_configure系统存储过程更改的配置选项的当前配置值 | RECONFIGURE |
2.自动提交事务
3.隐式事务

/*演示在将IMPLICIT_TRANSACTIONS设置为ON时显式或隐式启动事务。
使用@@trancount函数返回当前连接的活动事务数。 */
set nocount on
print cast(@@trancount as char(5))
create table table1(a int)
insert table1 values(1)
go
print cast(@@trancount as char(5))
print '使用显式事务'
begin tran
insert table1 values(2)
print '当前连接的活动事务数:'+cast(@@trancount as char(5))
commit tran
print '当前连接的活动事务数:'+cast(@@trancount as char(5))
go
print '设置 implicit_transactions为on'
set implicit_transactions on
go
print '使用隐式事务'
insert into table1 values(4) --这里不需要begin tran语句来定义事务的启动
print '当前连接的活动事务数:'+ cast(@@trancount as char(5))
commit tran
print '当前连接的活动事务数:'+ cast(@@trancount as char(5))
go
drop table table1
set implicit_transactions off
/*BEGIN TRANSACTION 语句使 @@TRANCOUNT 递增 1。
ROLLBACK TRANSACTION 将 @@TRANCOUNT 递减为 0,
但 ROLLBACK TRANSACTION savepoint_name 语句并不影响
@@TRANCOUNT 值。COMMIT TRANSACTION 将 @@TRANCOUNT 递减 1。*/
数据的锁定
1.通过Set lock_timeout 设置事务被阻塞的最长时间;通过@@lock_timeout查看。例如:
/*查看@@lock_timeout*/
print @@lock_timeout --LOCKTIMEOUT 的缺省值是 -1,这意味着将没有锁超时
set lock_timeout 1800
print @@lock_timeout
2. 定义事务隔离级别(4种) set transaction isolation level ... 。
3. 锁定提示。例如:
/*在select,insert,update和delete等语句中使用表级锁定提示*/
set transaction isolation level serializable
begin tran
select * from student with(tablock)
exec sp_lock
commit tran
select object_name(1013578649)