MSSQL事务开发指南
了解事務
?事務是作為單個邏輯工作單元執行的一系列操作。可以是一條SQL語句也可以是多條SQL語句。
?事務具有四個特性
??原子性:不可分隔、成則具成、敗則具敗。
??一致性:事務在完成時,必須使所有的數據都保持一致狀態
??隔離性:獨立的執行互不干擾。由并發事務所作的修改必須與任何其他并發事務所作的修改隔離。
??持久性:務完成之后,它對于系統的影響是永久性的。該修改即使出現系統故障也將一直保持。
?應用程序主要通過指定事務啟動和結束的時間來控制事務。
?啟動事務:使用 API 函數和 Transact-SQL 語句,可以按顯式、自動提交或隱式的方式來啟動事務。
?結束事務:您可以使用 COMMIT(成功) 或 ROLLBACK(失敗) 語句,或者通過 API 函數來結束事務。
?事務模式分為:顯示事務模式、隱式事務模式、自動事務模式。在SQL常用的是顯示模式。
?事務并發處理會產生的問題:
??1,丟失更新?
??當兩個或多個事務選擇同一行,然后基于最初選定的值更新該行時,會發生丟失更新問題。?
??每個事務都不知道其它事務的存在。最后的更新將重寫由其它事務所做的更新,這將導致數據丟失。 ??
??2,臟讀?
??當第二個事務選擇其它事務正在更新的行時,會發生未確認的相關性問題。?
??第二個事務正在讀取的數據還沒有確認并且可能由更新此行的事務所更改。
??3,不可重復讀?
??當第二個事務多次訪問同一行而且每次讀取不同的數據時,會發生不一致的分析問題。?
??不一致的分析與未確認的相關性類似,因為其它事務也是正在更改第二個事務正在讀取的數據。?
??然而,在不一致的分析中,第二個事務讀取的數據是由已進行了更改的事務提交的。而且,不一致的分析涉及多次(兩次或更多)讀取同一行,而且每次信息都由其它事務更改;因而該行被非重復讀取。?
??4,幻像讀?
??當對某行執行插入或刪除操作,而該行屬于某個事務正在讀取的行的范圍時,會發生幻像讀問題。?
??事務第一次讀的行范圍顯示出其中一行已不復存在于第二次讀或后續讀中,因為該行已被其它事務刪除。同樣,由于其它事務的插入操作,事務的第二次或后續讀顯示有一行已不存在于原始讀中。?
??事務的隔離級別
??該隔離級別定義一個事務必須與其他事務所進行的資源或數據更改相隔離的程度。事務隔離級別控制:
??讀取數據時是否占用鎖以及所請求的鎖類型。
??占用讀取鎖的時間。
??引用其他事務修改的行的讀取操作是否:
???在該行上的排他鎖被釋放之前阻塞其他事務。
???檢索在啟動語句或事務時存在的行的已提交版本。
???讀取未提交的數據修改。
?事務的隔離級別
??SQL語句可以使用SET TRANSACTION ISOLATION LEVEL來設置事務的隔離級別。
??1. Read Uncommitted:最低等級的事務隔離,僅僅保證了讀取過程中不會讀取到非法數據。上訴4種不確定情況均有可能發生。
??2. Read Committed:大多數主流數據庫的默認事務等級,保證了一個事務不會讀到另一個并行事務已修改但未提交的數據,避免了“臟讀取”。該級別適用于大多數系統。
??第一個查詢事務
??SET? TRANSACTION? ISOLATION? LEVEL?? Read Committed
??begin? tran
?? update Cate SET Sname=Sname+'b' where ID=1
?? SELECT * FROM cate where ID=1
?? waitfor? delay? '00:00:6'??
?? rollback? tran??--回滾事務
??select Getdate()
??SELECT * FROM cate where ID=1
??第二個查詢事務
??SET? TRANSACTION? ISOLATION? LEVEL? Read committed?? --把committed換成Read uncommitted可看到“臟讀取”的示例。
??SELECT * FROM cate where ID=1
??select Getdate()
??可以看到使用 Read Committed 成功的避免了“臟讀取”.
??3. Repeatable Read:保證了一個事務不會修改已經由另一個事務讀取但未提交(回滾)的數據。避免了“臟讀取”和“不可重復讀取”的情況,但是帶來了更多的性能損失。
??第一個查詢事務
??SET? TRANSACTION? ISOLATION? LEVEL? Repeatable Read? --?? 把Repeatable Read換成Read committed可以看到“不可重復讀取”的示例
??begin? tran
??SELECT * FROM cate where? ID=33?--第一次讀取數據
?? waitfor? delay? '00:00:6'??
??SELECT * FROM cate where? ID=33?--第二次讀取數據,不可重復讀取
??commit
??第二個查詢事務
??SET? TRANSACTION? ISOLATION? LEVEL? Read committed
??update cate set Sname=Sname+'JD' where ID=33
??SELECT * FROM cate where ID>30
??4. Serializable:最高等級的事務隔離,上面3種不確定情況都將被規避。這個級別將模擬事務的串行執行。
??在第一個查詢窗口執行
??SET? TRANSACTION? ISOLATION? LEVEL? Serializable -- 把Serializable換成Repeatable Read 可看到“幻像讀”的示例
??begin? tran
??SELECT * FROM cate where ID>30?--第一次讀取數據,“幻像讀”的示例
?? waitfor? delay? '00:00:6'?? --延遲6秒讀取
??SELECT * FROM cate where ID>30? --第一次讀取數據
??commit
??第二個查詢事務
??SET? TRANSACTION? ISOLATION? LEVEL? Read committed??
??Delete from cate where ID>33
??SELECT * FROM cate where ID>30??
創建事務
?設置事務級別:SET? TRANSACTION? ISOLATION? LEVEL
?開始事務:begin? tran
?提交事務:COMMIT
?回滾事務:ROLLBACK
?創建事務保存點:SAVE TRANSACTION savepoint_name
?回滾到事務點:ROLLBACK TRANSACTION savepoint_name
創建事務的原則:
盡可能使事務保持簡短很重要,當事務啟動后,數據庫管理系統 (DBMS) 必須在事務結束之前保留很多資源、以保證事務的正確安全執行。
特別是在大量并發的系統中, 保持事務簡短以減少并發 資源鎖定爭奪,將先得更為重要。
?1、事務處理,禁止與用戶交互,在事務開始前完成用戶輸入。
?2、在瀏覽數據時,盡量不要打開事務
?3、盡可能使事務保持簡短。
?4、考慮為只讀查詢使用快照隔離,以減少阻塞。
?5、靈活地使用更低的事務隔離級別。
?6、靈活地使用更低的游標并發選項,例如開放式并發選項。
?7、在事務中盡量使訪問的數據量最小。 ?
總結
以上是生活随笔為你收集整理的MSSQL事务开发指南的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 北方华创是芯片龙头吗 是半导体设备制造龙
- 下一篇: 在家开什么店又稳又能赚钱 推荐几个市场