事務和權限的一些知識點

事務

set XACT_ABORT --指定當tansact-SQL語句出現運行時錯誤時,SQL Sever是否自動回滾到當前事務

例子:
BEGIN TRANSACTION
set XACT_ABORT ON
DO Something.....
ROLLBACK TRAN
COMMINT TRAN

事務隔離級別越高,只允許一個事務來操作某張表
事務的併發性越高,安全性越低
提交讀(默認情況下)
可重複性讀
可串行讀(事務之間相互完全隔離)

髒讀:
放置一個事務讀到另外一個事務還沒有提交的記錄
某個事務在執行過程中未提交,但是過程中另外一個事務來取這個數據,就出現了未提交讀,也稱髒讀

不可重複讀
一個事務在自己沒有更新數據庫數據的情況下,同一個查詢操作執行兩次或多次的結果應該是一致的,如果不一致
就說明爲不可重複讀

丟失更新
如果兩個事務都要更新數據庫一個字段x

2)幻覺讀是指當事務不是獨立執行時發生的一種現象,例如第一個事務對一個表中的數據進行了修改,這種修改涉及到表中的全部數據行。同時,第二個事務也修改這個表中的數據,這種修改是向表中插入一行新數據。那麼,以後就會發生操作第一個事務的用戶發現表中還有沒有修改的數據行,就好象發生了幻覺一樣。例如,一個編輯人員更改作者提交的文檔,但當生產部門將其更改內容合併到該文檔的主複本時,發現作者已將未編輯的新材料添加到該文檔中。如果在編輯人員和生產部門完成對原始文檔的處理之前,任何人都不能將新材料添加到文檔中,則可以避免該問題。


還是上面的例子,事務A要兩次讀取表T的中數據,雖然設置   repeatable   read     可以防止事務B對數據進行修改,但是事務B卻可以向表T中插入新的數據。如何防止這個問題,我們可以考慮設置最高的事務隔離級別   set   tran   isolation   level   serializable。於是乎,事務B就只能乖乖的等待事務A的提交,才能想表T中插入新的數據,從而避免了幻讀!


隔離級別                未提交相關性(髒讀)          不一致分析(不可重複讀)      幻讀

提交讀                       否                            是                        是
可重複讀                     否                            否                        是
可串行讀                     否                            否                        否


幻讀和不可重複讀的區別?

不可重複讀的重點是修改 :
同樣的條件 ,   你讀取過的數據 ,   再次讀取出來發現值不一樣了
幻讀的重點在於新增或者刪除
同樣的條件 ,   第 1 次和第 2 次讀出來的記錄數不一樣

封鎖協議有三級。
  一級:當某一事務在修改數據時加獨佔鎖(exclusive locks, write locks),直到事務結束(提交或者回滾)釋放。因爲不能同時對某一數據進行修改,所以一級封鎖協議可防止丟失更新。但是讀取數據時沒有加任何鎖,它還是可以讀取加了獨佔鎖的數據,所以不能防止髒讀不可重複讀。
  二級:在一級封鎖基礎上事務讀數據時加共享鎖(shared locks , read locks),讀取之後釋放(共享鎖範圍是每次讀取)。二級封鎖協議可防止丟失更新,髒讀。不能防止不可重複讀。

  三級:在一級封鎖基礎上事務讀數據時加共享鎖,直到事務結束釋放(共享鎖範圍是整個事務)。三級封鎖協議可防止丟失更新,髒讀,不可重複讀。



權限

一般的Sa爲登陸名,而dbo爲用戶名
如果sa希望操作某個庫,必須將sa映射到dbo這個用戶名,纔可以進行操作,否則光有登錄名是不管用的

而dbo還必須分配一個權限,點擊屬性進行添加,
而如果一個公司有500個人,那是否要分配500個用戶名呢?這樣很累,就引用了組 引申到角色的這個概念

EXEC SP_ADDLOGIN '需要建的登錄名' ,'需要設置的密碼' 
EXEC SP_GREANTDBACCESS '剛纔新建的登陸名','需要新建的用戶'
EXEC SP_ADDROLE '需要新建的角色名'
EXEC SP_ADDROLEMEMBER '剛纔建的角色名','剛纔建的用戶'
GRANT UPDATE ON TABLENAME TO '剛纔新建的角色名'
GRANT SELECT ON TABLENAME TO '剛纔新建的用戶'

這樣配置一個登陸賬戶,就實現了



一個讓人有興趣的存儲過程例子:

if object_id('testP','p') IS NOT NULL
       drop proc testP
Go
create proc testP
@a int,@b int
as
select @a/@b

exec testP  @b=3,@a=9

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章