diff --git "a/47\346\233\276\345\276\267\346\243\256/2022-9-28-\344\272\213\345\212\241/.keep" "b/47\346\233\276\345\276\267\346\243\256/2022-9-28-\344\272\213\345\212\241/.keep" new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git "a/47\346\233\276\345\276\267\346\243\256/2022-9-28-\344\272\213\345\212\241/\346\233\276\345\276\267\346\243\256/\344\275\234\344\270\232/\344\275\234\344\270\232.sql" "b/47\346\233\276\345\276\267\346\243\256/2022-9-28-\344\272\213\345\212\241/\346\233\276\345\276\267\346\243\256/\344\275\234\344\270\232/\344\275\234\344\270\232.sql" new file mode 100644 index 0000000000000000000000000000000000000000..071a53c23aaac7cad9c6883bf3562487abe82898 --- /dev/null +++ "b/47\346\233\276\345\276\267\346\243\256/2022-9-28-\344\272\213\345\212\241/\346\233\276\345\276\267\346\243\256/\344\275\234\344\270\232/\344\275\234\344\270\232.sql" @@ -0,0 +1,49 @@ +select * from AccountInfo +select * from BankCard +select * from CardExchange +select * from CardStateChange +select * from CardTransfer + + +--1.假设刘备取款6000,(添加check约束,设置账户余额必须>=0),要求:使用事务实现,修改余额和添加取款记录两步操作使用事务 +alter table BankCard add constraint CK_Money check(CardMoney>=0) +begin transaction A +declare @Myerror int =0 +declare @myerr int = 0 +update BankCard set CardMoney = CardMoney-6000 where CardNo ='6225125478544587' +set @myerr += @@error +insert into CardExchange (CardNo,MoneyInBank,MoneyOutBank,ExchangeTime) +values('6225125478544587',0,6000,GETDATE()) +set @myerr += @@error +if @Myerror = 0 +begin + commit transaction + print'取款成功' +end +else +begin +rollback transaction + print'取款失败' +end +--2.刘备向张飞转账1000元,(添加check约束,设置账户余额必须>=0) +alter table BankCard add constraint CK_Money check(CardMoney>=0) +begin transaction +declare @error int = 0 +declare @myerry int = 0 +update BankCard set CardMoney = CardMoney -1000 where CardNo = '6225125478544587' +set @myerry+=@@ERROR +update BankCard set CardMoney = CardMoney + 1000 where CardNo = '6225547854125656' +set @myerry+=@@ERROR +insert into CardTransfer(CardNoOut,CardNoIn,TransferMoney,TransferTime) +values('6225125478544587','6225547854125656',1000,GETDATE()) +set @myerry+=@@ERROR +if @error = 0 + begin + commit + print '转账成功' + end +else + begin + rollback + print '转账失败' + end \ No newline at end of file diff --git "a/47\346\233\276\345\276\267\346\243\256/2022-9-28-\344\272\213\345\212\241/\346\233\276\345\276\267\346\243\256/\347\254\224\350\256\260/\347\254\224\350\256\260.md" "b/47\346\233\276\345\276\267\346\243\256/2022-9-28-\344\272\213\345\212\241/\346\233\276\345\276\267\346\243\256/\347\254\224\350\256\260/\347\254\224\350\256\260.md" new file mode 100644 index 0000000000000000000000000000000000000000..37c865da947e2db8d9643ab7fb3d9405187e15d3 --- /dev/null +++ "b/47\346\233\276\345\276\267\346\243\256/2022-9-28-\344\272\213\345\212\241/\346\233\276\345\276\267\346\243\256/\347\254\224\350\256\260/\347\254\224\350\256\260.md" @@ -0,0 +1,68 @@ +鍦ㄦ暟鎹簱涓紝鎴戜滑灏嗕竴鏉 SQL 璇彞绉颁负涓娆″熀鏈殑鎿嶄綔銆傚皢鑻ュ共鏉 SQL 璇彞鈥滄墦鍖呪濆湪涓璧凤紝鍏卞悓鎵ц涓涓畬鏁寸殑浠诲姟锛岃繖灏辨槸浜嬪姟銆 + +浜嬪姟锛 Transaction锛夌敱涓娆℃垨鑰呭娆″熀鏈搷浣滄瀯鎴愶紝鎴栬呰锛屼簨鍔$敱涓鏉℃垨鑰呭鏉 SQL 璇彞鏋勬垚銆 + +浜嬪姟鏈変竴涓渶鏄捐憲鐨勭壒寰侊紝灏辨槸瀹冨寘鍚殑鎵鏈 SQL 璇彞浣滀负涓涓暣浣撳悜鏁版嵁搴撴彁浜わ紝鍙湁鎵鏈夌殑 SQL 璇彞閮芥墽琛屽畬鎴愶紝鏁翠釜浜嬪姟鎵嶇畻鎴愬姛锛屼竴鏃︽煇涓 SQL 璇彞鎵ц澶辫触锛屾暣涓簨鍔″氨澶辫触浜嗐備簨鍔″け璐ュ悗闇瑕佸洖婊氭墍鏈夌殑 SQL 璇彞銆 + +浜嬪姟涓殑鎵鏈 SQL 璇彞鏄竴涓暣浣擄紝鍏卞悓杩涢锛屼笉鍙垎鍓诧紝瑕佷箞鍏ㄩ儴鎵ц鎴愬姛锛岃涔堝叏閮ㄦ墽琛屽け璐ャ + +浜嬪姟鏈夊緢澶氬疄鐢ㄧ殑鍦烘櫙銆備緥濡傚浜庣數鍟嗙綉绔欙紝閫氬父灏嗙敤鎴疯鍗曞瓨鍌ㄥ湪涓寮犺〃涓紝灏嗗晢鍝佸簱瀛樻儏鍐靛瓨鍌ㄥ湪鍙︿竴寮犺〃涓紝褰撴湁鐢ㄦ埛涓嬪崟鏃讹紝闇瑕佹墽琛屼袱鏉 SQL 璇彞锛屼竴鏉¤礋璐f洿鏂拌鍗曡〃锛屼竴鏉¤礋璐f洿鏂板簱瀛樿〃锛岃繖涓ゆ潯 SQL 璇彞蹇呴』鍚屾椂鎵ц鎴愬姛銆傚鏋滃彧鏈変竴鏉¤鍙ユ墽琛屾垚鍔燂紝鍙︿竴鏉¤鍙ユ墽琛屽け璐ワ紝灏嗗鑷存暟鎹簱鍑洪敊锛岃繖绉嶅悗鏋滄槸鏃犳硶鎺ュ彈鐨勩 + +涓轰簡閬垮厤鍑虹幇鎰忓锛屽彲浠ュ皢浠ヤ笂涓ゆ潯璇彞鏀惧埌涓涓簨鍔′腑锛屽叾涓竴鏉¤鍙ユ墽琛屽け璐ユ椂锛屾暟鎹簱灏嗗洖婊氬埌鍘熸潵鐨勭姸鎬併傚浜庝拱瀹舵潵璇达紝鏁版嵁搴撳洖婊氫細瀵艰嚧涓嬪崟澶辫触锛屼絾杩欏緢瀹规槗澶勭悊锛岃涔板鍐嶆涓嬪崟鍗冲彲銆傛暟鎹簱鐨勬纭ф案杩滄槸鏈閲嶈鐨勩 + +鍏跺疄鎴戜滑骞虫椂浣跨敤鏁版嵁搴撴椂锛屽氨宸茬粡鍦ㄤ娇鐢ㄤ簨鍔′簡锛屽彧涓嶈繃杩欑浜嬪姟鍙寘鍚竴鏉 SQL 璇彞锛屽苟涓旂敱鏁版嵁搴撳紩鎿庤嚜鍔ㄥ皝瑁呭拰鎻愪氦銆傝繖鎰忓懗鐫锛屽浜庝换浣曚竴鏉 SQL 璇彞锛岃涔堟墽琛屾垚鍔燂紝瑕佷箞鎵ц澶辫触锛屼笉鑳芥垚鍔熶竴閮ㄥ垎锛屽け璐ヤ竴閮ㄥ垎銆 +浜嬪姟鐨勫睘鎬 +涓鑸潵璇达紝浜嬪姟鍏锋湁鍥涗釜鏍囧噯灞炴э紝鍒嗗埆鏄師瀛愭э紙Atomicity锛屾垨绉颁笉鍙垎鍓叉э級銆佷竴鑷存э紙Consistency锛夈侀殧绂绘э紙Isolation锛屽張绉扮嫭绔嬫э級銆佹寔涔呮э紙Durability锛夛紝绠绉 ACID銆傚叿浣撹鏄庡涓嬶細 +1) 鍘熷瓙鎬 +涓涓簨鍔′腑鐨勬墍鏈 SQL 璇彞锛岃涔堝叏閮ㄦ墽琛屾垚鍔燂紝瑕佷箞鍏ㄩ儴鎵ц澶辫触锛屼笉浼氱粨鏉熷湪涓棿鐨勬煇涓幆鑺傘備簨鍔″湪鎵ц杩囩▼涓彂鐢熼敊璇紝浼氳鍥炴粴锛圧ollback锛夊埌浜嬪姟寮濮嬪墠鐨勭姸鎬侊紝灏卞儚杩欎釜浜嬪姟浠庢潵娌℃湁鎵ц杩囦竴鏍枫 +2) 涓鑷存 +鍦ㄤ簨鍔″紑濮嬩箣鍓嶅拰浜嬪姟缁撴潫浠ュ悗锛屾暟鎹簱鐨勫畬鏁存ф病鏈夎鐮村潖銆傝繖琛ㄧず鍐欏叆鐨勬暟鎹繀椤诲畬鍏ㄧ鍚堟墍鏈夌殑棰勮瑙勫垯锛屽叾涓寘鍚暟鎹殑绮剧‘搴︺佷覆鑱旀т互鍙婂悗缁暟鎹簱鍙互鑷彂鎬у湴瀹屾垚棰勫畾鐨勫伐浣溿 +3) 闅旂鎬 +鏁版嵁搴撳厑璁稿涓苟鍙戜簨鍔″悓鏃跺鍏舵暟鎹繘琛岃鍐欏拰淇敼鐨勮兘鍔涳紝闅旂鎬у彲浠ラ槻姝㈠涓簨鍔″苟鍙戞墽琛屾椂鐢变簬浜ゅ弶鎵ц鑰屽鑷存暟鎹殑涓嶄竴鑷淬備簨鍔¢殧绂诲垎涓轰笉鍚岀骇鍒紝鍖呮嫭璇绘湭鎻愪氦锛圧ead uncommitted锛夈佽鎻愪氦锛坮ead committed锛夈佸彲閲嶅璇伙紙repeatable read锛夊拰涓茶鍖栵紙Serializable锛夈 +4) 鎸佷箙鎬 +浜嬪姟澶勭悊缁撴潫鍚庯紝瀵规暟鎹殑淇敼灏辨槸姘镐箙鐨勶紝鍗充究绯荤粺鏁呴殰涔熶笉浼氫涪澶便 +浜嬪姟鎵ц娴佺▼ +鍚勭鏁版嵁搴撳浜嬪姟鐨勬敮鎸佺粏鑺備笉灏界浉鍚岋紝鏈暀绋嬩互 MySQL 鏁版嵁搴撲负渚嬭繘琛岃瑙o紝MySQL 浣跨敤鏍囧噯 SQL 鏉ユ敮鎸佷簨鍔° + +涓庝簨鍔℃帶鍒舵湁鍏崇殑 SQL 鍛戒护鍖呮嫭锛 +BEGIN 鎴栬 START TRANSACTION锛氬紑濮嬩簨鍔★紱 +COMMIT锛氭彁浜や簨鍔★紱 +ROLLBACK锛氬洖婊氫簨鍔★紱 +SAVEPOINT锛氬湪浜嬪姟鍐呴儴璁剧疆鍥炴粴鏍囪鐐癸紱 +RELEASE SAVEPOINT锛氬垹闄ゅ洖婊氭爣璁扮偣锛 +ROLLBACK TO锛氬皢浜嬪姟鍥炴粴鍒版爣璁扮偣锛圧OLLBACK 鍛戒护鐨勪竴绉嶅彉褰㈠啓娉曪級銆 + +涓涓簨鍔¤涔堟彁浜わ紙Commit锛夛紝瑕佷箞鍥炴粴锛圧ollback锛夛紝鎻愪氦鎰忓懗鐫鎴愬姛锛屽洖婊氭剰鍛崇潃澶辫触銆傜紪鍐欎簨鍔′唬鐮佹椂锛屼互 BEGIN 鍛戒护寮澶达紝鍚庤窡涓鏉℃垨鑰呭鏉 SQL 璇彞锛屾渶鍚庝功鍐 COMMIT 鎴栬 ROLLBACK 鍛戒护锛汣OMMIT 鍜 ROLLBACK 瀵瑰簲浜嬪姟鐨勪袱绉嶇姸鎬侊紝鍙兘鍑虹幇涓涓 + +浜嬪姟鎺у埗鍛戒护浠呰兘涓 DML 绫诲埆鐨 SQL 鍛戒护涓璧蜂娇鐢紝鍖呮嫭 INSERT銆乁PDATE銆丏ELETE 鍜 SELECT锛屽湪鍒涘缓鎴栬呭垹闄よ〃鏃朵笉鑳戒娇鐢ㄤ簨鍔★紝鍥犱负杩欎簺鎿嶄綔鍦ㄦ暟鎹簱涓槸鑷姩鎻愪氦鐨勩 +1) 寮濮嬩簨鍔 +寮濮嬩簨鍔℃湁浠ヤ笅涓ょ鍛戒护锛岄夋嫨鍏朵竴鍗冲彲锛 +COMMIT; + +鎴栬 +START TRANSACTION; + +璇ュ懡浠ょ敤鏉ユ爣璁颁竴涓簨鍔$殑璧峰鐐广 +2) 鎻愪氦浜嬪姟 +鎻愪氦浜嬪姟浣跨敤濡備笅鍛戒护锛 +COMMIT; + +鎻愪氦浜嬪姟鎰忓懗鐫鐪熸鎵ц浜嬪姟鍖呭惈鐨 SQL 璇彞锛屽苟鎶婂鏁版嵁搴撶殑淇敼鍐欏叆鍒扮鐩樹笂鐨勭墿鐞嗘暟鎹簱涓侰OMMIT 鎰忓懗鐫浜嬪姟缁撴潫锛屽苟涓旀墽琛屾垚鍔熴 + + +3) 鍥炴粴浜嬪姟 +鍥炴粴鎰忓懗鐫鎾ら攢灏氭湭淇濆瓨鍒扮墿鐞嗘暟鎹簱涓殑鎿嶄綔锛屽叿浣撹娉曟牸寮忓涓嬶細 +ROLLBACK; +浜嬪姟鎵ц杩囩▼涓鏋滃彂鐢熶簡鏌愮鏁呴殰锛屼簨鍔′笉鑳界户缁墽琛岋紝灏卞彲浠ユ挙閿浜嬪姟锛屾鏃跺鏁版嵁搴撶殑淇敼骞朵笉浼氫繚瀛樺埌鐗╃悊鏁版嵁搴撲腑銆傛挙閿鎰忓懗鐫浜嬪姟缁撴潫锛屽苟涓旀墽琛屽け璐ャ + +4) 鍥炴粴鏍囪鐐 +ROLLBACK 鍛戒护榛樿鍥炴粴鏁翠釜浜嬪姟锛屼篃鍗充簨鍔′腑鐨勬墍鏈変慨鏀规搷浣滈兘鏃犳晥銆備絾鏄 SQL 鍏佽鍥炴粴浜嬪姟鐨勪竴閮ㄥ垎锛屾鏃堕渶瑕佸湪浜嬪姟涓缃竴涓爣璁扮偣锛屽湪璇ユ爣璁扮偣涔嬪悗鐨 SQL 璇彞灏嗚鍥炴粴锛屼箣鍓嶇殑 SQL 璇彞灏嗚鎴愬姛鎵ц銆 + +璁剧疆鏍囪鐐逛娇鐢 SAVEPOINT 鍛戒护锛屽叿浣撹娉曞涓嬶細 +SAVEPOINT point_name; + +point_name 涓烘爣璁扮偣鍚嶅瓧銆 + +鍥炴粴鍒版爣璁扮偣浣跨敤 ROLLBACK TO 鍛戒护锛屽叿浣撹娉曞涓嬶細 +ROLLBACK TO point_name; +