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)