diff --git "a/13\345\217\267\351\203\221\346\226\207\346\272\220/\344\275\234\344\270\232/9.28\344\275\234\344\270\232.txt" "b/13\345\217\267\351\203\221\346\226\207\346\272\220/\344\275\234\344\270\232/9.28\344\275\234\344\270\232.txt" new file mode 100644 index 0000000000000000000000000000000000000000..6760662af830b468888e2fe5950a01c5428976bd --- /dev/null +++ "b/13\345\217\267\351\203\221\346\226\207\346\272\220/\344\275\234\344\270\232/9.28\344\275\234\344\270\232.txt" @@ -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/13\345\217\267\351\203\221\346\226\207\346\272\220/\347\254\224\350\256\260/9.28\347\254\224\350\256\260.txt" "b/13\345\217\267\351\203\221\346\226\207\346\272\220/\347\254\224\350\256\260/9.28\347\254\224\350\256\260.txt" new file mode 100644 index 0000000000000000000000000000000000000000..dcda1c6dbbc96861288adf68e15fb7d4be849777 --- /dev/null +++ "b/13\345\217\267\351\203\221\346\226\207\346\272\220/\347\254\224\350\256\260/9.28\347\254\224\350\256\260.txt" @@ -0,0 +1,27 @@ +事务 +事务( Transaction)由一次或者多次基本操作构成,或者说,事务由一条或者多条 SQL 语句构成。 + +事务中的所有 SQL 语句是一个整体,共同进退,不可分割,要么全部执行成功,要么全部执行失败。 + +事务的属性(ACID) +一般来说,事务具有四个标准属性,分别是原子性(Atomicity,或称不可分割性)、一致性(Consistency)、隔离性(Isolation,又称独立性)、持久性(Durability),简称 ACID。具体说明如下: + +1) 原子性 +一个事务中的所有 SQL 语句,要么全部执行成功,要么全部执行失败,不会结束在中间的某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。 + +2) 一致性 +在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的数据必须完全符合所有的预设规则,其中包含数据的精确度、串联性以及后续数据库可以自发性地完成预定的工作。 + +3) 隔离性 +数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。 死锁 操作系统 + +4) 持久性 +事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。 + +事务分类 +自动提交事物: 是SQL Server默认的一种事务模式,每条Sql语句都被看成一个事务进行处理。 + +显式事务: T-sql标明,由Begin Transaction开启事务开始,由Commit Transaction 提交事务、Rollback Transaction 回滚事务结束。 + +隐式事务:使用Set IMPLICIT_TRANSACTIONS ON 将将隐式事务模式打开,不用Begin Transaction开启事务,当一个事务结束,这个模式会自动启用下一个事务,只用Commit Transaction 提交事务、Rollback Transaction 回滚事务即可。 +