锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
璇誨凡鎻愪氦錛圧ead Committed錛?br />
褰撲竴涓簨鍔¤繍琛屽湪榪欎釜闅旂綰у埆鏃訛紝 涓涓猄ELECT 鏌ヨ鍙兘鐪嬪埌鏌ヨ寮濮嬩箣鍓嶆彁浜ょ殑鏁版嵁鑰屾案榪滄棤娉曠湅鍒版湭鎻愪氦鐨勬暟鎹垨鑰呮槸鍦ㄦ煡璇㈡墽琛屾椂鍏朵粬騫惰鐨勪簨鍔℃彁浜ゅ仛鐨勬敼鍙樸傦紙涓嶈繃SELECT 鐨勭‘鐪嬪緱瑙佸悓涓嬈′簨鍔′腑鍓嶉潰鏇存柊鐨勭粨鏋滐紟鍗充嬌瀹冧滑榪樻病鎻愪氦涔熺湅寰楀埌錛庯級(jí)瀹為檯涓婏紝涓涓猄ELECT 鏌ヨ鐪嬪埌涓涓湪璇ユ煡璇㈠紑濮嬭繍琛岀殑鐬棿璇ユ暟鎹簱鍦頒竴涓揩鐓с傝娉ㄦ剰涓や釜鐩擱偦鐨凷ELECT 鍙兘鐪嬪埌涓嶅悓鐨勬暟鎹紝鍝曞畠浠槸鍦ㄥ悓涓涓簨鍔¢噷錛屽洜涓哄叾瀹冧簨鍔′細(xì)鍦ㄧ涓涓猄ELECT鎵ц鐨勬椂鍊欐彁浜?
璇誨凡鎻愪氦闅旂綰у埆
璇誨凡鎻愪氦錛圧ead Committed錛?鏄?PostgreSQL 閲岀殑緙虹渷闅旂綰у埆銆?褰撲竴涓簨鍔¤繍琛屽湪榪欎釜闅旂綰у埆鏃訛紝 涓涓?SELECT 鏌ヨ鍙兘鐪嬪埌鏌ヨ寮濮嬩箣鍓嶆彁浜ょ殑鏁版嵁鑰屾案榪滄棤娉曠湅鍒版湭鎻愪氦鐨勬暟鎹垨鑰呮槸鍦ㄦ煡璇㈡墽琛屾椂鍏朵粬騫惰鐨勪簨鍔℃彁浜ゅ仛鐨勬敼鍙樸?錛堜笉榪?SELECT 鐨勭‘鐪嬪緱瑙佸悓涓嬈′簨鍔′腑鍓嶉潰鏇存柊鐨勭粨鏋溿傚嵆浣垮畠浠繕娌℃彁浜や篃鐪嬪緱鍒般傦級(jí) 瀹為檯涓婏紝涓涓?SELECT 鏌ヨ鐪嬪埌涓涓湪璇ユ煡璇㈠紑濮嬭繍琛岀殑鐬棿璇ユ暟鎹簱鐨勪竴涓揩鐓с?璇鋒敞鎰忎袱涓浉閭?cè)潥?SELECT 鍛戒護(hù)鍙兘鐪嬪埌涓嶅悓鐨勬暟鎹紝鍝曞畠浠槸鍦ㄥ悓涓涓簨鍔¢噷錛?鍥犱負(fù)鍏跺畠浜嬪姟浼?xì)鍦ńW竴涓猄ELECT鎵ц鐨勬椂鍊欐彁浜わ紟
UPDATE錛?DELETE錛?鎴栬?SELECT FOR UPDATE 鍦ㄦ悳绱㈢洰鏍囪鐨勬椂鍊欑殑琛屼負(fù)鍜孲ELECT 涓鏍鳳細(xì) 瀹冧滑鍙兘鎵懼埌鍦ㄥ懡浠ゅ紑濮嬬殑鏃跺欏凡緇忔彁浜ょ殑琛屻?涓嶈繃錛岃繖鏍風(fēng)殑鐩爣琛屽湪琚壘鍒扮殑鏃跺欏彲鑳藉凡緇忚鍏跺畠騫跺彂鐨勪簨鍔℃洿鏂幫紙鎴栬呭垹闄わ紝鎴栬呮爣璁頒負(fù)鏇存柊鐨勶級(jí)銆?鍦ㄨ繖縐嶆儏鍐典笅錛屽嵆灝嗚繘琛岀殑鏇存柊灝嗙瓑寰呯涓涓洿鏂頒簨鍔℃彁浜ゆ垨鑰呭洖婊氾紙濡傛灉瀹冭繕鍦ㄥ鐞嗭級(jí)銆?濡傛灉絎竴涓洿鏂板洖婊氾紝閭d箞瀹冪殑浣滅敤灝嗚蹇界暐錛岃岀浜屼釜鏇存柊鑰呭皢緇х畫鏇存柊鏈鍒濆彂鐜扮殑琛屻?濡傛灉絎竴涓洿鏂拌呮彁浜わ紝閭d箞濡傛灉絎竴涓洿鏂拌呭垹闄や簡(jiǎn)璇ヨ錛屽垯絎簩涓洿鏂拌呭皢蹇界暐璇ヨ錛?鍚﹀垯瀹冨皢璇曞浘鍦ㄨ琛岀殑宸叉洿鏂扮殑鐗堟湰涓婃柦鍔犲畠鐨勬搷浣溿傜郴緇熷皢閲嶆柊璁$畻鍛戒護(hù)鎼滅儲(chǔ)鏉′歡錛圵HERE 瀛愬彞錛夛紝 鐪嬬湅璇ヨ宸叉洿鏂扮殑鍔炰笉閭f槸鍚︿粛鐒剁鍚堟悳绱㈡潯浠躲傚鏋滄槸錛屽垯絎簩涓洿鏂扮戶緇叾鎿嶄綔錛屼粠璇ヨ鐨勫凡鏇存柊鐗堟湰寮濮嬨?
鍥犱負(fù)涓婇潰鐨勮鍒欙紝姝e湪鏇存柊鐨勫懡浠ゅ彲鑳戒細(xì)鐪嬪埌涓嶄竴鑷寸殑蹇収 --- 瀹冧滑鍙互鐪嬪埌褰卞搷瀹冧滑璇曞浘鏇存柊鐨勫茍鍙戞洿鏂板懡浠ょ殑鏁堟灉錛?浣嗘槸瀹冧滑鐪嬩笉鍒伴偅浜涘懡浠ゅ鏁版嵁搴撻噷鍏跺畠琛岀殑浣滅敤銆?榪欐牱鐨勮涓轟護(hù)璇誨凡鎻愪氦妯″紡涓嶉傚悎鐢ㄤ簬鍝娑夊強(qiáng)澶嶆潅鎼滅儲(chǔ)鏉′歡鐨勫懡浠ゃ?涓嶈繃錛屽畠瀵逛簬綆鍗曠殑鎯呭喌鑰岃█鏄紜殑銆傛瘮濡傦紝鍋囪鎴戜滑鐢ㄧ被浼間笅闈㈣繖鏍風(fēng)殑鍛戒護(hù)鏇存柊閾惰浣欓錛?
BEGIN; UPDATE accounts SET balance = balance + 100.00 WHERE acctnum = 12345; UPDATE accounts SET balance = balance - 100.00 WHERE acctnum = 7534; COMMIT;濡傛灉涓や釜騫跺彂浜嬪姟璇曞浘淇敼甯愬彿 12345 鐨勪綑棰濓紝閭f垜浠緢鏄庢樉甯屾湜絎簩涓簨鍔℃槸浠庡笎鎴瘋鐨勫凡緇忔洿鏂拌繃鐨勭増鏈笂榪涜鏇存柊銆?鍥犱負(fù)姣忎釜鍛戒護(hù)鍙槸褰卞搷涓涓凡緇忓喅瀹氫簡(jiǎn)鐨勮錛屽洜姝よ瀹冪湅鍒版洿鏂板悗鐨勭増鏈笉浼?xì)瀵艰嚧鋼Q浣曚笉涓鑷寸殑闂銆?
鍥犱負(fù)鍦ㄨ宸叉彁浜ゆā寮忛噷錛屾瘡涓柊鐨勫懡浠ら兘鏄粠涓涓柊鐨勫揩鐓у紑濮嬬殑錛岃岃繖涓揩鐓у寘鍚墍鏈夊埌璇ユ椂鍒諱負(fù)姝㈠凡緇忔彁浜ょ殑浜嬪姟錛?鍥犳鍚屼竴涓簨鍔¢噷鐨勫悗闈㈢殑鍛戒護(hù)灝嗙湅鍒頒換浣曞凡鎻愪氦鐨勫茍鍙戜簨鍔$殑鏁堟灉銆?榪欓噷瑕佽冭檻鐨勯棶棰樻槸鎴戜滑鍦ㄤ竴涓懡浠ら噷鏄惁鐪嬪埌鏁版嵁搴撻噷緇濆涓鑷寸殑瑙嗗浘銆?
璇誨凡鎻愪氦妯″紡鎻愪緵鐨勯儴鍒嗕簨鍔¢殧紱誨浜庤澶氬簲鐢ㄨ岃█鏄凍澶熺殑錛屽茍涓旇繖涓ā寮忛熷害蹇紝浣跨敤綆鍗曘?涓嶈繃錛屽浜庡仛澶嶆潅鏌ヨ鍜屾洿鏂扮殑搴旂敤錛屽彲鑳介渶瑕佷繚璇佹暟鎹簱鏈夋瘮璇誨凡鎻愪氦妯″紡鎻愪緵鐨勬洿鍔犱弗鏍肩殑涓鑷存ц鍥俱?
12.2.2. 鍙覆琛屽寲闅旂綰у埆
鍙覆琛屽寲錛圫erializable錛?綰у埆鎻愪緵鏈涓ユ牸鐨勪簨鍔¢殧紱匯?榪欎釜綰у埆妯℃嫙涓茶鐨勪簨鍔℃墽琛岋紝 灝卞ソ璞′簨鍔″皢琚竴涓帴鐫涓涓偅鏍蜂覆琛岀殑錛岃屼笉鏄茍琛岀殑鎵ц銆?涓嶈繃錛屼嬌鐢ㄨ繖涓駭鍒殑搴旂敤蹇呴』鍑嗗鍦ㄤ覆琛屽寲澶辮觸鐨勬椂鍊欓噸鏂板彂鍔ㄤ簨鍔★紟
褰撲竴涓簨鍔″浜庡彲涓茶鍖栫駭鍒紝 涓涓?SELECT 鏌ヨ鍙兘鐪嬪埌鍦ㄤ簨鍔″紑濮嬩箣鍓嶆彁浜ょ殑鏁版嵁鑰屾案榪滅湅涓嶅埌鏈彁浜ょ殑鏁版嵁鎴栦簨鍔℃墽琛屼腑鍏朵粬騫惰浜嬪姟鎻愪氦鐨勪慨鏀廣?錛堜笉榪囷紝SELECT 鐨勭‘鐪嬪緱鍒板悓涓嬈′簨鍔′腑鍓嶉潰鐨勬洿鏂扮殑鏁堟灉銆傚嵆浣夸簨鍔¤繕娌℃湁鎻愪氦涔熶竴鏍楓傦級(jí) 榪欎釜琛屼負(fù)鍜岃宸叉彁浜ょ駭鍒槸涓嶅お涓鏍鳳紝瀹冪殑 SELECT 鐪嬪埌鐨勬槸璇ヤ簨鍔″紑濮嬫椂鐨勫揩鐓э紝鑰屼笉鏄浜嬪姟鍐呴儴褰撳墠鏌ヨ寮濮嬫椂鐨勫揩鐓с?榪欐牱錛屼竴涓簨鍔″唴閮ㄥ悗闈㈢殑 SELECT 鍛戒護(hù)鎬繪槸鐪嬪埌鍚屾牱鐨勬暟鎹?
UPDATE錛?DELETE錛屽拰 SELECT FOR UPDATE 鍦ㄦ悳绱㈢洰鏍囪涓婄殑琛屼負(fù)鍜?SELECT 涓鏍鳳細(xì) 瀹冧滑灝嗗彧瀵繪壘鍦ㄤ簨鍔″紑濮嬬殑鏃跺欏凡緇忔彁浜ょ殑鐩爣琛屻備絾鏄紝 榪欐牱鐨勭洰鏍囪鍦ㄨ鍙戠幇鐨勬椂鍊欏彲鑳藉凡緇忚鍙﹀涓涓茍鍙戠殑浜嬪姟鏇存柊浜?jiǎn)锛堟垨鑰呮槸鍒犻櫎鎴栬呮槸鏍囪涓烘洿鏂幫級(jí)銆?鍦ㄨ繖縐嶆儏鍐典笅錛屽彲涓茶鍖栫殑浜嬪姟灝嗙瓑寰呯涓涓鍦ㄦ洿鏂扮殑浜嬪姟鎻愪氦鎴栬呭洖婊氾紙濡傛灉瀹冧粛鐒跺湪澶勭悊涓級(jí)銆?濡傛灉絎竴涓洿鏂拌呭洖婊氾紝閭d箞瀹冪殑褰卞搷灝嗚蹇界暐錛?鑰岃繖涓彲涓茶鍖栫殑灝卞彲浠ョ戶緇洿鏂板畠鏈鍒濆彂鐜扮殑琛屻?浣嗘槸濡傛灉絎竴涓洿鏂拌呮彁浜や簡(jiǎn)錛堝茍涓斿疄闄呬笂鏇存柊鎴栬呭垹闄や簡(jiǎn)璇ヨ錛岃屼笉鍙槸涓烘洿鏂伴変腑瀹冿級(jí)閭d箞鍙覆琛屽寲浜嬪姟灝嗗洖婊氾紝騫惰繑鍥炰笅闈俊鎭?
ERROR: Can't serialize access due to concurrent update鍥犱負(fù)涓涓彲涓茶鍖栫殑浜嬪姟鍦ㄥ彲涓茶鍖栦簨鍔″紑濮嬩箣鍚庝笉鑳芥洿鏀硅鍏朵粬浜嬪姟鏇存敼榪囩殑琛屻?
褰撳簲鐢ㄦ敹鍒拌繖鏍風(fēng)殑閿欒淇℃伅鏃訛紝瀹冨簲璇ラ鍑哄綋鍓嶇殑浜嬪姟鐒跺悗浠庡ご寮濮嬮噸鏂拌繘琛屾暣涓簨鍔°?絎簩嬈¤繍琛屾椂錛岃浜嬪姟鐪嬪埌鐨勫墠涓嬈℃彁浜ょ殑淇敼鏄鏁版嵁搴撳垵濮嬬殑鏍峰瓙涓殑涓閮ㄥ垎錛?鎵浠ユ妸鏂扮増鏈殑琛屼綔涓烘柊浜嬪姟鏇存柊鐨勮搗鐐逛笉浼?xì)鏈夐昏緫鍐茬獊銆?
璇鋒敞鎰忓彧鏈夋洿鏂頒簨鍔℃墠闇瑕侀噸璇曪紝鍙浜嬪姟浠庢潵娌℃湁涓茶鍖栧啿紿侊紟
鍙覆琛屽寲浜嬪姟綰у埆鎻愪緵浜?jiǎn)涓ユ牸鐨勪繚璇佸Q氭瘡涓簨鍔¢兘鐪嬪埌涓涓畬鍏ㄤ竴鑷寸殑鏁版嵁搴撶殑瑙嗗浘銆?涓嶈繃錛屽鏋滃茍琛屾洿鏂頒護(hù)鏁版嵁搴撲笉鑳界淮鎸佷覆琛屾墽琛岀殑鏍峰瓙錛岄偅涔堝簲鐢ㄥ繀欏誨噯澶囬噸璇曚簨鍔°?鍥犱負(fù)閲嶅仛澶嶆潅鐨勪簨鍔$殑寮閿鍙兘鏄潪甯稿彲瑙傜殑錛屾墍浠ユ垜浠彧寤鴻鍦ㄦ洿鏂板懡浠や腑鍖呭惈瓚沖澶嶆潅鐨勯昏緫錛?鍦ㄨ宸叉彁浜ょ駭鍒腑鍙兘瀵艱嚧閿欒鐨勭粨鏋滅殑鎯呭喌涓嬫墠浣跨敤銆?鏈甯歌鐨勬槸錛屽彲涓茶鍖栨ā寮忓彧鏄湪榪欐牱鐨勬儏鍐典笅鏄繀瑕佺殑錛氫竴涓簨鍔¤繛緇仛鑻ュ共涓懡浠わ紝 鑰岃繖鍑犱釜鍛戒護(hù)蹇呴』鐪嬪埌鏁版嵁搴撳畬鍏ㄤ竴鏍風(fēng)殑瑙嗗浘銆?/p>
鏈枃鏉ヨ嚜CSDN鍗氬錛岃漿杞借鏍囨槑鍑哄錛歨ttp://blog.csdn.net/lanbaibai/archive/2004/06/29/29547.aspx