diff --git "a/38\345\274\240\345\205\210\346\235\260/\344\275\234\344\270\232/2022.9.28\344\275\234\344\270\232--.\344\272\213\345\212\241.sql" "b/38\345\274\240\345\205\210\346\235\260/\344\275\234\344\270\232/2022.9.28\344\275\234\344\270\232--.\344\272\213\345\212\241.sql" new file mode 100644 index 0000000000000000000000000000000000000000..d26a839b655fb2f1d134be5cc1f463b072662eb3 --- /dev/null +++ "b/38\345\274\240\345\205\210\346\235\260/\344\275\234\344\270\232/2022.9.28\344\275\234\344\270\232--.\344\272\213\345\212\241.sql" @@ -0,0 +1,99 @@ +--假设刘备取款6000,(添加check约束,设置账户余额必须>=0),要求:使用事务实现,修改余额和添加取款记录两步操作使用事务 +--账户余额>=0约束 +alter table BankCard add constraint CK_Money check(CardMoney >= 0) + +declare @myError int = 0 +declare @getMoney float = 6000 +declare @carID varchar(10) +declare @name varchar(10) +declare @Phone varchar(10) +set @name = '刘备' + +select @carID = (select b.CardNo from AccountInfo a inner join BankCard b on a.AccountId =b.AccountId where RealName = @name) +select @Phone = (select a.AccountPhone from AccountInfo a inner join BankCard b on a.AccountId =b.AccountId where RealName = @name) +--开始事务 +begin transaction A +update BankCard set CardMoney -= @getMoney where CardNo = @carID +set @myError += @@ERROR +insert into CardExchange values(@carID,0,@getMoney,getdate()) +set @myError += @@ERROR +--事务提交 +if(@myError = 0) +begin + commit transaction A +end +else +begin + rollback transaction B +end +go + +--2.刘备向张飞转账1000元,(添加check约束,设置账户余额必须>=0) +alter table BankCard add constraint CK_Money check(CardMoney >= 0) +declare @myError int = 0 +declare @getMoney float = 1000 +declare @carID varchar(10) +declare @carID1 varchar(10) +declare @name varchar(10) +declare @name1 varchar(10) +declare @Phone varchar(10) +declare @Phone1 varchar(10) +set @name = '刘备' +set @name1 = '张飞' +select @carID = (select b.CardNo from AccountInfo a inner join BankCard b on a.AccountId =b.AccountId where RealName = @name) +select @Phone = (select a.AccountPhone from AccountInfo a inner join BankCard b on a.AccountId =b.AccountId where RealName = @name) +select @carID1 = (select b.CardNo from AccountInfo a inner join BankCard b on a.AccountId =b.AccountId where RealName = @name1) +select @Phone1 = (select a.AccountPhone from AccountInfo a inner join BankCard b on a.AccountId =b.AccountId where RealName = @name1) + +begin transaction A +update BankCard set CardMoney -= @getMoney where CardNo = @carID +set @myError += @@ERROR +update BankCard set CardMoney += @getMoney where CardNo = @carID1 +set @myError += @@ERROR +insert into CardTransfer values(@carID,@carID1,@getMoney,getdate()) +set @myError += @@ERROR + +if(@myError = 0) +begin + commit transaction A +end +else +begin + rollback transaction B +end + + +--列转行 +CREATE TABLE grades1 ( + id int NOT NULL , + name varchar(20) DEFAULT NULL, + subject varchar(20) DEFAULT NULL, + score int DEFAULT NULL, + +) + +INSERT INTO grades1 VALUES (1, 'lyy', '英语', 100); +INSERT INTO grades1 VALUES (2, 'lyy', '数学', 98); +INSERT INTO grades1 VALUES (3, 'lyy', '语文', 97); +INSERT INTO grades1 VALUES (4, 'gss', '英语', 89); +INSERT INTO grades1 VALUES (5, 'gss', '数学', 88); +INSERT INTO grades1 VALUES (6, 'gss', '语文', 87); +INSERT INTO grades1 VALUES (7, 'liming', '英语', 79); +INSERT INTO grades1 VALUES (8, 'liming', '数学', 77); +INSERT INTO grades1 VALUES (9, 'liming', '语文', 75); + +select * from grades1 + +select name, +max(case subject when '英语' then score else 0 end)英语, +max(case subject when '数学' then score else 0 end)数学, +max(case subject when '语文' then score else 0 end)语文 +from grades1 +group by name + +select * from grades1 +pivot +( +max(score) +for subject in([英语],[数学],[语文]) +) as a \ No newline at end of file diff --git "a/38\345\274\240\345\205\210\346\235\260/\347\254\224\350\256\260/2022.9.28\347\254\224\350\256\260--\344\272\213\345\212\241.md" "b/38\345\274\240\345\205\210\346\235\260/\347\254\224\350\256\260/2022.9.28\347\254\224\350\256\260--\344\272\213\345\212\241.md" new file mode 100644 index 0000000000000000000000000000000000000000..8d29b60b5388247fb66d5c874f9dceb59432cee9 --- /dev/null +++ "b/38\345\274\240\345\205\210\346\235\260/\347\254\224\350\256\260/2022.9.28\347\254\224\350\256\260--\344\272\213\345\212\241.md" @@ -0,0 +1,37 @@ +#### 浜嬪姟 + +**浜嬪姟锛 Transaction锛夌敱涓娆℃垨鑰呭娆″熀鏈搷浣滄瀯鎴愶紝鎴栬呰锛屼簨鍔$敱涓鏉℃垨鑰呭鏉 SQL 璇彞鏋勬垚銆** + +**浜嬪姟涓殑鎵鏈 SQL 璇彞鏄竴涓暣浣擄紝鍏卞悓杩涢锛屼笉鍙垎鍓诧紝瑕佷箞鍏ㄩ儴鎵ц鎴愬姛锛岃涔堝叏閮ㄦ墽琛屽け璐ャ** + + + +#### 浜嬪姟鐨勫睘鎬(ACID) + +涓鑸潵璇达紝浜嬪姟鍏锋湁鍥涗釜鏍囧噯灞炴э紝鍒嗗埆鏄師瀛愭э紙**A**tomicity锛屾垨绉颁笉鍙垎鍓叉э級銆佷竴鑷存э紙**C**onsistency锛夈侀殧绂绘э紙**I**solation锛屽張绉扮嫭绔嬫э級銆佹寔涔呮э紙**D**urability锛夛紝绠绉 **ACID**銆傚叿浣撹鏄庡涓嬶細 + +##### 1) 鍘熷瓙鎬 + +涓涓簨鍔′腑鐨勬墍鏈 SQL 璇彞锛岃涔堝叏閮ㄦ墽琛屾垚鍔燂紝瑕佷箞鍏ㄩ儴鎵ц澶辫触锛屼笉浼氱粨鏉熷湪涓棿鐨勬煇涓幆鑺傘備簨鍔″湪鎵ц杩囩▼涓彂鐢熼敊璇紝浼氳鍥炴粴锛圧ollback锛夊埌浜嬪姟寮濮嬪墠鐨勭姸鎬侊紝灏卞儚杩欎釜浜嬪姟浠庢潵娌℃湁鎵ц杩囦竴鏍枫 + +##### 2) 涓鑷存 + +鍦ㄤ簨鍔″紑濮嬩箣鍓嶅拰浜嬪姟缁撴潫浠ュ悗锛屾暟鎹簱鐨勫畬鏁存ф病鏈夎鐮村潖銆傝繖琛ㄧず鍐欏叆鐨勬暟鎹繀椤诲畬鍏ㄧ鍚堟墍鏈夌殑棰勮瑙勫垯锛屽叾涓寘鍚暟鎹殑绮剧‘搴︺佷覆鑱旀т互鍙婂悗缁暟鎹簱鍙互鑷彂鎬у湴瀹屾垚棰勫畾鐨勫伐浣溿 + +##### 3) 闅旂鎬 + +鏁版嵁搴撳厑璁稿涓苟鍙戜簨鍔″悓鏃跺鍏舵暟鎹繘琛岃鍐欏拰淇敼鐨勮兘鍔涳紝闅旂鎬у彲浠ラ槻姝㈠涓簨鍔″苟鍙戞墽琛屾椂鐢变簬浜ゅ弶鎵ц鑰屽鑷存暟鎹殑涓嶄竴鑷淬備簨鍔¢殧绂诲垎涓轰笉鍚岀骇鍒紝鍖呮嫭璇绘湭鎻愪氦锛圧ead uncommitted锛夈佽鎻愪氦锛坮ead committed锛夈佸彲閲嶅璇伙紙repeatable read锛夊拰涓茶鍖栵紙Serializable锛夈 姝婚攣 鎿嶄綔绯荤粺 + +##### 4) 鎸佷箙鎬 + +浜嬪姟澶勭悊缁撴潫鍚庯紝瀵规暟鎹殑淇敼灏辨槸姘镐箙鐨勶紝鍗充究绯荤粺鏁呴殰涔熶笉浼氫涪澶便 + +#### 浜嬪姟鍒嗙被 + +**鑷姩鎻愪氦浜嬬墿**锛 鏄疭QL Server榛樿鐨勪竴绉嶄簨鍔℃ā寮忥紝姣忔潯Sql璇彞閮借鐪嬫垚涓涓簨鍔¤繘琛屽鐞嗐 + +**鏄惧紡浜嬪姟**: T-sql鏍囨槑锛岀敱Begin Transaction寮鍚簨鍔″紑濮嬶紝鐢盋ommit Transaction 鎻愪氦浜嬪姟銆丷ollback Transaction 鍥炴粴浜嬪姟缁撴潫銆 + +**闅愬紡浜嬪姟**锛氫娇鐢⊿et IMPLICIT_TRANSACTIONS ON 灏嗗皢闅愬紡浜嬪姟妯″紡鎵撳紑锛屼笉鐢˙egin Transaction寮鍚簨鍔★紝褰撲竴涓簨鍔$粨鏉燂紝杩欎釜妯″紡浼氳嚜鍔ㄥ惎鐢ㄤ笅涓涓簨鍔★紝鍙敤Commit Transaction 鎻愪氦浜嬪姟銆丷ollback Transaction 鍥炴粴浜嬪姟鍗冲彲銆 + +![](D:\绯荤粺缂撳瓨\妗岄潰\鍥剧墖\image.png) \ No newline at end of file