1.显示事务
它是通过 BEGIN TRANSACTION 、 COMMIT TRANSACTION 、ROLLBACK TRANSACTION 、 SAVE TRANSACTION 等Transact-SQL语句来完成的。
1 use test 2 go 3 4 /*启动一个事务向student表中插入一个记录*/ 5 begin transaction 6 insert into student values(100,'陈浩','男',19) 7 commit tran 8 9 select * from student 10 go
1 /*启动一个事务向student表中删除一个记录,然后回滚该事务*/ 2 begin transaction 3 delete student where sno=100 4 rollback 5 6 select * from student --由于回滚该事务,因此student表中没有插入记录。 7 go
1 /*在事务内设置保存点*/ 2 begin transaction mytran --启动事务 3 select * from student 4 save transaction s1 --设置保存点。 5 insert into student values(200,'王洪','男',22) --插入另一个学生的记录 6 rollback transaction s1 --事务回滚到保存点s1 7 commit transaction 8 go 9 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.隐式事务

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