sql server 2008学习12 事务和锁
事務
事務的點:
1.begin tran
是事務開始的地方,也是 事務回滾的起點.也就說他會忽略這個起點之后的最終沒有提交的所有語句,
2.commit tran
事務的提交 是一個事務的終點
當發出 commit tran命令時,可以認為 該事務是 持久的.
撤銷已完成事務的唯一方法 是 發出一個新的事務.從功能上而言,該事務 是對第一個事務的反轉.
3.rollback tran
事務回滾到 begin執行之前的狀態. 不過也有例外,也可以 使用? 保存點.
4.save tran
保存事務從本質上說就是創建書簽. 為書簽起個名字,就是在回滾中 引用它.
創建書簽的好處就是? 可以 回滾到代碼中的特定位置.
注意: rollback之后會清楚所有的保存點..
事務全部是關于原子性的.
sql server 的日志工作方式:
在數據庫的正常操作中,大多數執行的活動都是 “記錄”在 事務日志上,而非直接寫入數據庫中.
檢查點 是指 強制把數據庫現在所使用的臟頁 寫入磁盤的周期性操作
臟頁 一些在讀入到緩存后 已經被修改,但是所進行的修改還沒有寫入到磁盤的日志或數據頁.
寫入日志的過程
鎖和并發:
SQL Server鎖類型(SQL)收藏?? 1. HOLDLOCK: 在該表上保持共享鎖,直到整個事務結束,而不是在語句執行完立即釋放所添加的鎖。???? 2. NOLOCK:不添加共享鎖和排它鎖,當這個選項生效后,可能讀到未提交讀的數據或“臟數據”,這個選項僅僅應用于SELECT語句。???? 3. PAGLOCK:指定添加頁鎖(否則通常可能添加表鎖)。???? 4. READCOMMITTED用與運行在提交讀隔離級別的事務相同的鎖語義執行掃描。默認情況下,SQL Server 2000 在此隔離級別上操作。。???? 5. READPAST: 跳過已經加鎖的數據行,這個選項將使事務讀取數據時跳過那些已經被其他事務鎖定的數據行,而不是阻塞直到其他事務釋放鎖,READPAST僅僅應用于READ COMMITTED隔離性級別下事務操作中的SELECT語句操作。???? 6. READUNCOMMITTED:等同于NOLOCK。???? 7. REPEATABLEREAD:設置事務為可重復讀隔離性級別。???? 8. ROWLOCK:使用行級鎖,而不使用粒度更粗的頁級鎖和表級鎖。???? 9. SERIALIZABLE:用與運行在可串行讀隔離級別的事務相同的鎖語義執行掃描。等同于 HOLDLOCK。???? 10. TABLOCK:指定使用表級鎖,而不是使用行級或頁面級的鎖,SQL Server在該語句執行完后釋放這個鎖,而如果同時指定了HOLDLOCK,該鎖一直保持到這個事務結束。???? 11. TABLOCKX:指定在表上使用排它鎖,這個鎖可以阻止其他事務讀或更新這個表的數據,直到這個語句或整個事務結束。???? 12. UPDLOCK :指定在讀表中數據時設置更新 鎖(update lock)而不是設置共享鎖,該鎖一直保持到這個語句或整個事務結束,使用UPDLOCK的作用是允許用戶先讀取數據(而且不阻塞其他用戶讀數據),并且保證在后來再更新數據時,這一段時間內這些數據沒有被其他用戶修改。
鎖? 是 一種防止在某對象執行動作的一個進程 于已在該對象上執行的其他進程 相沖突的機制.
通過鎖可以防止的問題:
- 臟讀
- 非重復性讀取
- 幻讀
- 丟失更新
1.臟讀
如果一個事務讀取的記錄 是另一個未完成事務的一部分,那么這時 就發生了臟讀.
如果第一個事務正常完成,那么就沒問題.如果回滾的話,那將從數據庫看來從未發生的事務中獲取信息.
2.非重復性讀取
如果一個事務中兩次讀取記錄,而另一個事務在這期間改變了數據,就會發生 非重復性讀取.
3.幻讀
就update數據的同時有人執行insert語句.
4.丟失更新
同時又兩個事務,都在更新一條數據,
其中一個更新數據完畢退出了.這是 另一個事務才開始更新此條數據,那么就導致 第一個事務做的更新 丟失了.
可以鎖定的資源:
- 數據庫
- 表,鎖定整個表,包括 實際的數據行,以及與表相關聯的所有索引中的鍵.
- 區段
- 頁: 該頁上的數據或索引鍵
- 鍵:在索引中的特定鍵或一系列的鍵. 相同索引頁的其他鍵不受影響.
- 行或RID
鎖定模式
??????????? ,直到真正進行物理更新的時候,需要一個排它鎖.
??? 這說明,更新操作 有一下兩個不同的階段:
??? 1)指出滿足where子句條件的內容,該查詢有個 共享鎖
???? 2)決定執行更新,那么鎖 升級為 排它鎖..否則,將鎖轉換為 共享鎖.
? 如果沒有更新鎖,死鎖就會一直出現.兩個更新查詢會在 共享模式下運行.
a完成了它的查詢工作,并準備進行物理更新.它想升級為排它鎖.他是不可以這么做,因為b正在完成查詢.除非b需要進行物理更新,否則它會完成查詢. 為了做到這點,b必須升級為排它鎖,但是不能這么做,因為a正在等待.
??? 4.意向鎖
??? 是真正的占位符,它用來處理對象層次問題.
假設一下,已對某一行建立了鎖,但是有人想在頁上或區上 建立鎖,那么您肯定不愿意.
如果沒有意向鎖,那么較高層次的對象將不會知道較低層次上有鎖.意向鎖可改進性能,因為sql server 只需要在表層上檢查意向鎖,以此來決定事務 是否可以 安全地 鎖定整個表.
意向鎖分為以下三種類型:
5.模式鎖
分為以下兩種:
? 6.批量更新鎖(BU)
允許并行加載數據.
設置隔離級別:
使用 set transaction isolation level 級別
1.read committed
通過 read committed , 任何創建的共享鎖 將在創建它們的語句完成后 自動釋放.
2.read uncommitted
是所有隔離級別選擇中最危險的.但是他在速度方面有最好的性能.
設置 該級別,將告訴sql server 不要設置任何鎖,也不要實現任何鎖.
3.pepeatable read
會稍微地 將隔離級別升級,并提供一個額外的并發保護層.不僅能防止臟讀,而且可以防止非重復性讀取.
4.serializable
該鎖 是堡壘級 的隔離級別. 除了丟失更新意外,它防止所有形式的并發問題.甚至能防止幻讀.
4.snapshot
是最新的一種隔離級別. 只有為 數據庫打開 allow_snapshot_isolation ,? 該級別才可用.
總結
以上是生活随笔為你收集整理的sql server 2008学习12 事务和锁的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 衣柜发黄怎么处理?
- 下一篇: 在重庆高度为50米的房子房间距为30米会