事務
1、BEGIN TRAN
開始事務
2、COMMIT TRAN
提交事務
3、ROLLBACK TRAN
回滾事務
4、SAVE TRAN(不推薦初學者使用)
保存要回滾的點。
SQL Server 日誌的工作方式
數據存入數據庫前,先存入緩存,在存入日誌,最後存入數據庫。
在書中的5中情況下會發出檢查點,判斷是否恢復。
1、失敗和恢復
2、隱式事務(危險的)
鎖和併發
併發是指同一時間多用戶執行同樣交互的操作。
鎖可以使相同操作的多個用戶,後來的進行等待。
1、通過鎖可以防止的問題
1)髒讀
一個事務讀取的是另一個未完成事務的值。
解決方法:事務隔離級別(READ COMMITTED)。
2)非重複性讀取
一個事務兩次讀取值,而另一個事務該變了值。
解決方法:
CHECK約束。
將隔離級別設置爲REPEATABLE READ或SERIALIZABLE。
3)幻讀
一些數據在進行修改的時候,剛好執行了插入操作,導致一些數據沒被修改。
解決方法:設置隔離級別爲:SERIALIZABLE
4)丟失更新
一個更新成功寫入數據庫後,而又意外的被另一個事務重寫了。
2、可以鎖定的資源
資源包括:數據庫、表、區段、頁、鍵、行或行標識符
3、鎖升級和鎖對性能的影響
當鎖數量達到一定的限度時,則會升級爲下一個更高的層次。
4、鎖定模式
1)共享鎖
共享鎖可以防止用戶執行髒讀。
2)排他鎖
可以防止兩個人同時更新、刪除或執行任何操作。
3)更新鎖
共享鎖+排他鎖
4)意向鎖
3種類型:意向共享鎖、意向排他鎖、共享意向排他鎖。
5)模式鎖
模式修改鎖:不能執行查詢、CREATE、ALTER、DROP操作
模式穩定性鎖定:類似共享鎖。
6)批量更新鎖
執行任何普通操作都會將表鎖定。
5、鎖的兼容性
見書389
6、指定一種特有的鎖定類型——優化器提示(高級)
1)使用Management Studio確定鎖
設置隔離級別
1)READ COMMITTED
可以防止髒讀。
2)READ UNCOMMITTED(最危險)
取消所有的鎖。
3)REPEATABLE READ
可以防止髒讀和非重複性讀取。
4)SERIALIZABLE
可以防止所有。
5)SNAPSHOT
類似READ COMMITTED和READ UNCOMMITTED。
只有數據庫打開了ALLOW_SNAPSHOT_ISOLATION選項時纔可以使用。
處理死鎖(1205錯誤)
1、SQL Server 判斷死鎖的方式
每隔5秒進行檢查
2、選擇死鎖的犧牲者的方式
選擇回滾代價最低的事務。
3、避免死鎖
1)按相同的順序使用對象。
2)使事務儘可能簡短。
3)儘可能使用最低的事務隔離級別。
4)不要採用允許無限中斷的事務。