A. 關系型資料庫和非關系型區別
關系型資料庫和非關系型在成本、查詢速率、儲存格式、可擴展性、數據一致絕行性、事務處理上有區別。
B. 標准sql規范中定義的四個事務隔離級別
在標准SQL規范中,定義了4個事務隔離級別,不同的隔離級別對事務的處理不同:
◆未授權讀取(Read Uncommitted):允許臟讀取,但不允許更新丟失。如果一個事務已經開始寫數據,則另外一個數據則不允許同時進行寫操作,但允許其他事務讀此行數據。該隔離級別可以通過「排他寫鎖」實現。
◆授權讀取(Read Committed):允許不可重復讀取,但不允許臟讀取。這可以通過「瞬間共享讀鎖」和「排他寫鎖」實現。讀取數據的事務允許其他事務繼續訪問該行數據,但是未提交的寫事務將會禁止其他事務訪問該行。
◆可重復讀取(Repeatable Read):禁止不可重復讀取和臟讀取,但是有時可能出現幻影數據。這可以通過「共享讀鎖」和「排他寫鎖」實現。讀取數據的事務將會禁止寫事務(但允許讀事務),寫事務則禁止任何其他事務。
◆序列化(Serializable):提供嚴格的事務隔離。它要求事務序列化執行,事務只能一個接著一個地執行,但不能並發執行。如果僅僅通過「行級鎖」是無法實現事務序列化的,必須通過其他機制保證新插入的數據不會被剛執行查詢操作的事務訪問到。
隔離級別越高,越能保證數據的完整性和一致性,但是對並發性能的影響也越大。對於多數應用程序,可以優先考慮把資料庫系統的隔離級別設為Read Committed,它能夠避免臟讀取,而且具有較好的並發性能。盡管它會導致不可重復讀、虛讀和第二類丟失更新這些並發問題,在可能出現這類問題的個別場合,可以由應用程序採用悲觀鎖或樂觀鎖來控制。
通過前面的介紹已經知道,通過選用不同的隔離等級就可以在不同程度上避免前面所提及的在事務處理中所面臨的各種問題。所以,資料庫隔離級別的選取鎮此就顯得尤為重要,在選取資料庫的隔離級別時,應該注意以下幾個處理的原則:
首先,必須排除「未授權讀取」,因為在多個事務之間使用它將會是非常危險的。事務的回滾操作或失敗將會影響到其他並發事務。第一個事務的回滾將會完全將其他事務的操作清除,甚至使資料庫處在一個不一致的狀態。很可能一個已回滾為結束的事務對數據的修改最後卻修改提交了,因為「未授權讀取」允許其他事務讀取數據,最後整個錯誤狀態在其他事務之間傳播開來。
其次,絕大部分應用都無須使用「序列化御液迅」隔離(一般來說,讀取幻影數據並不是一個問題),此隔離級別也難以測量。目前使用序列化隔離的應用中,一般都使用悲觀鎖,這樣強行使所有事務都序列化執行。
剩下的也就是在「授權讀取」和「可重復讀取」之間選擇了。我們先考慮可重復讀取。如果所有的數據訪問都是在統一的原子資料庫事務中,此隔離級別將消除一個事務在另外一個並發事務過程中覆蓋數據的可能性(第二個事務更新丟失問題)。這是一個非常重要的問題,但是使用可重復讀取並不是解決問題的途徑。
假設使用了「版本數據」,Hibernate會自動使用版本數據。Hibernate的一級Session緩存和版本數據已經為你提供了「可重復讀取隔離」絕大部分的特性。特別是,版本數據可以防止二次更新丟失的問題,一級Session緩存可以保證持久載入數據的狀態與其他事務對數據的修改隔離開來,因此如果使用對所有的資料庫事務採用授權讀取隔離和版本數據是行得通的。
「可重復讀取」為資料庫查詢提供了更好的效率(僅對那些長時間的資料庫事務),但是由於幻影讀取依然存在,因此沒必要使用它(對於Web應用來說,一般也很少在一個資料庫事務中對同一個表查詢兩次)。
也可以同時考慮選擇使用Hibernate的二級緩存,它可以如同底層埋斗的資料庫事務一樣提供相同的事務隔離,但是它可能弱化隔離。假如在二級緩存大量使用緩存並發策略,它並不提供重復讀取語義(例如,後面章節中將要討論的讀寫,特別是非嚴格讀寫),很容易可以選擇默認的隔離級別:因為無論如何都無法實現「可重復讀取」,因此就更沒有必要拖慢資料庫了。另一方面,可能對關鍵類不採用二級緩存,或者採用一個完全的事務緩存,提供「可重復讀取隔離」。那麼在業務中需要使用到「可重復讀取」嗎?如果你喜歡,當然可以那樣做,但更多的時候並沒有必要花費這個代價。
C. sqlserver中事務的作用是什麼
sql server中事務的作用是如果任何一個語句操作失敗那麼整個操作就被失敗,以後操作就會回滾到操作前狀態,或者是上個節點。為了確保要麼執行,要麼不執行,就可以使用事務。是指訪問並可能更新資料庫中各種數據項的一個程序邏輯執行單元(unit)。
(3)csql事務處理擴展閱讀:
事務通常由高級資料庫操縱語言或編程語言(如SQL,C++或Java)書寫的用戶程序的執行所引起,並用形如begin transaction和end transaction語句(或函數調用)來界定。事務由事務開始(begin transaction)和事務結束(end transaction)之間執行的全體操作組成。
一個事務的執行不能被其他事務干擾。即一個事務內部的操作及使用的數據對並發的其他事務是隔離的,並發執行的各個事務之間不能互相干擾。
D. 在SQL中怎樣使用事務
SQL Server 需要顯示的定義 開始一個事務.
BEGIN TRANSACTION;
例如:
1> BEGIN TRY
2> -- SQL Server 需要顯示的定義 開始一個事務.
3> BEGIN TRANSACTION;
4> -- 插入2條同樣的數據,使主鍵重復,引發錯誤後回滾事務.
5> INSERT INTO test_main(id, value) VALUES (4, 'FOUR');
6> INSERT INTO test_main(id, value) VALUES (4, 'FOUR');
7> -- 執行成功後,需要提交事務.
8> COMMIT;
9> END TRY
10> BEGIN CATCH
11> PRINT('Main.錯誤代碼 = ' + STR(ERROR_NUMBER()));
12> PRINT('Main.錯誤嚴重級別 = ' + STR(ERROR_SEVERITY()));
13> PRINT('Main.錯誤狀態代碼 = ' + STR(ERROR_STATE()));
14> PRINT('Main.錯誤信息 = ' + ERROR_MESSAGE());
15> -- 回滾事務
16> ROLLBACK;
17> END CATCH
18>
19> go
E. SQL 對事務的管理包括哪幾方面
首先你得了解什麼是事務?
第一點:事務是一種機制.是一個操作序列,它包含一組資料庫操作命令,並且所有的命令作為一個整體一起向系統提交或撤消,即這一組資料庫命令要麼都執行,要麼都不執行.
第二點:你要了解事務的4個屬性,即ACID
原子性:事務是一個完整的操作
一致性:當事務完成時,數據是必須處於一致狀態
隔離性:對數據進修改的所有並發事務是彼此隔離的.
持久性:事務完成後,它對於系統的影響是永久的.
而你問如何管理事務,主要由下列語句
1.開始事務:begin tran
2.提交事務:commit tran
3.回滾事務:rollback tran
至於如何運用這些語句,其實很簡單,你在編寫事務SQL語句時,一定會存在if語句,也就是說,你認為對的,是正確的,就寫上提交事務,你認為錯了就回滾事務,但這些必須是語句最開頭寫上開始事務!