天天看點

共享鎖(S鎖)和排它鎖(X鎖)

共享鎖【S鎖】

又稱讀鎖,若事務T對資料對象A加上S鎖,則事務T可以讀A但不能修改A,其他事務隻能再對A加S鎖,而不能加X鎖,直到T釋放A上的S鎖。這保證了其他事務可以讀A,但在T釋放A上的S鎖之前不能對A做任何修改。共享鎖是造成上鎖對象必須被大家共享,它排斥 排他鎖,是以别的會話不能獨占資源對其修改(“修改”會先給修改對象加上 排他鎖 的)。但不排斥其他共享鎖,是以一個對象可被多個會話同時加上共享鎖。

排他鎖【X鎖】

又稱寫鎖。若事務T對資料對象A加上X鎖,事務T可以讀A也可以修改A,其他事務不能再對A加任何鎖,直到T釋放A上的鎖。這保證了其他事務在T釋放A上的鎖之前不能再讀取和修改A。排他鎖很好了解,是自己獨占資源。其它會話想再在同一對象上加共享或排他鎖都是不允許的。不過其它會話可以讀,這也證明普通的讀是不上鎖的。如果查的對象被修改,查詢操作還會會被重定向到對應的撤銷塊(原來的資料),以保證事務事物隔離和讀一緻;

簡單地講,當我們需要修改表結構的時候(如,create index,alter table add|drop column,修改表字段屬性),就需要在表上加表級共享鎖。需要對某條記錄執行DML操作的時候,就需要對被操作記錄加上行級排它鎖。鎖是自動加上的,不需要我們手工加鎖,如果需要使用者手工加鎖的話,一般是lock xxxxx;的方式。

下面舉例:

通過DML語句對一張表的某一行資料進行修改,一個事務開始,背後的步驟是:

1.對這張表加一個共享鎖。這麼做是為了防止别的會話通過DDL語句修改這張表的表結構。DDL語句要修改了這張表,就必須給表加上排他鎖。但是現在給表加了共享鎖了,也就排斥了DDL去加排他鎖;

2.對修改的那一行加一個排他鎖,别的會話不能修改這一行。但是我對整張表加的是共享鎖而不是排他鎖,是以别的會話還是可以修改其他行(也經曆1、2兩個步驟)

有兩點補充:

1.鎖的意義就是為了保護對象,是以它們其實有一個共同的目的,那就是不允許其它會話對我的上鎖對象本身進行修改。對表而言是表結構,對行而言是每個字段的資料。

2.上鎖對象可以是表,也可以是表裡面的行(是整個行,給行上了排他鎖後,所有字段的資料都不許别人動)。

鎖跟事務是聯系在一起的,鎖的生命周期是事務開始到事務結束(不管是送出還是復原都是結束)

參考:

http://www.itpub.net/thread-1829284-1-1.html