From 9815258958aec5a7fa4630141b2ef582bcdf057a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=91=A8=E9=A3=98?= <2422417047@qq.com> Date: Mon, 19 Sep 2022 18:41:21 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BA=8B=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...272\213\345\212\241(begin transaction).md" | 35 ++++++++++++ ...\274\210begin transaction\357\274\211.md" | 55 +++++++++++++++++++ 2 files changed, 90 insertions(+) create mode 100644 "40\345\221\250\351\243\230/\344\275\234\344\270\232/2022.09.19 \347\254\254\344\271\235\350\212\202\350\257\276-\344\272\213\345\212\241(begin transaction).md" create mode 100644 "40\345\221\250\351\243\230/\347\254\224\350\256\260/2022.09.19 \347\254\254\344\271\235\350\212\202\350\257\276-\344\272\213\345\212\241\357\274\210begin transaction\357\274\211.md" diff --git "a/40\345\221\250\351\243\230/\344\275\234\344\270\232/2022.09.19 \347\254\254\344\271\235\350\212\202\350\257\276-\344\272\213\345\212\241(begin transaction).md" "b/40\345\221\250\351\243\230/\344\275\234\344\270\232/2022.09.19 \347\254\254\344\271\235\350\212\202\350\257\276-\344\272\213\345\212\241(begin transaction).md" new file mode 100644 index 0000000..863b25d --- /dev/null +++ "b/40\345\221\250\351\243\230/\344\275\234\344\270\232/2022.09.19 \347\254\254\344\271\235\350\212\202\350\257\276-\344\272\213\345\212\241(begin transaction).md" @@ -0,0 +1,35 @@ +```sql +use BankTest +go + +select * from AccountInfo +select * from BankCard +select * from CardExchange +select * from CardStateChange +select * from CardTransfer + +--2.刘备向张飞转账1000元,(添加check约束,设置账户余额必须>=0) +alter table BankCard add check(CardMoney>=0) +begin transaction +declare @num int=0 +declare @money money=1000 +declare @card varchar(20)=(select CardNo from BankCard where AccountId=(select AccountId from AccountInfo where RealName='刘备')) +declare @cards varchar(20)=(select CardNo from BankCard where AccountId=(select AccountId from AccountInfo where RealName='张飞')) +update BankCard set CardMoney=CardMoney-@money where AccountId=(select AccountId from AccountInfo where RealName='刘备') +update BankCard set CardMoney=CardMoney+@money where AccountId=(select AccountId from AccountInfo where RealName='张飞') +set @num += @@ERROR +insert into CardExchange(CardNo,MoneyInBank,MoneyOutBank,ExchangeTime) values(@card,'0','1000',GETDATE()),(@cards,'1000','0',GETDATE()) +insert into CardTransfer(CardNoOut,CardNoIn,TransferMoney,TransferTime) values(@card,@cards,'1000',GETDATE()) + +if @num>0 + begin + print '转账失败' + rollback transaction + end +else + begin + print '转账成功' + commit transaction + end +``` + diff --git "a/40\345\221\250\351\243\230/\347\254\224\350\256\260/2022.09.19 \347\254\254\344\271\235\350\212\202\350\257\276-\344\272\213\345\212\241\357\274\210begin transaction\357\274\211.md" "b/40\345\221\250\351\243\230/\347\254\224\350\256\260/2022.09.19 \347\254\254\344\271\235\350\212\202\350\257\276-\344\272\213\345\212\241\357\274\210begin transaction\357\274\211.md" new file mode 100644 index 0000000..6560c11 --- /dev/null +++ "b/40\345\221\250\351\243\230/\347\254\224\350\256\260/2022.09.19 \347\254\254\344\271\235\350\212\202\350\257\276-\344\272\213\345\212\241\357\274\210begin transaction\357\274\211.md" @@ -0,0 +1,55 @@ +### 一,事务 + +#### 1,概念 + +* 事务( Transaction)由一次或者多次基本操作构成,或者说,事务由一条或者多条 SQL 语句构成 + + + +#### 2,执行流程 + +* **开始事务(==begin transaction==) ** + +* **提交事务(==commit transaction==)** +* **回滚事务(==rollback transaction==)** +* **保存事务(==save transaction==)** + + + +#### 3、自动提交事务 + +* SQL Server的默认模式,它将每条单独的T-SQL语句视为一个事务。如果成功执行,则自动提交,否则回滚。 + + + +#### 4,分类 + +* **显式事务** + + 以begin trnsaction语句显示开始,以commit和rollback语句显示结束。在此过程中用户掌控着事务开始,结束与取消的操作 + +* **隐式事务** + + 当上一个事务结束后,系统隐式地自动开启一个新事务。每个事务都要显示地以commit和rollback语句结束 + + + +#### 5,属性(ACID) + +##### (1) 原子性(**A**tomicity,或称不可分割性) + +* **一个事务中的所有 SQL 语句,要么全部执行成功,要么全部执行失败,不会结束在中间的某个环节。**事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样 + +##### (2) 一致性(**C**onsistency) + +* 在事务开始之前和事务结束以后,**数据库的完整性没有被破坏**。这表示写入的数据必须完全符合所有的预设规则,其中包含数据的精确度、串联性以及后续数据库可以自发性地完成预定的工作 + +##### (3) 隔离性(**I**solation,又称独立性) + +* 数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以**防止多个事务并发执行时由于交叉执行而导致数据的不一致**。 +* 事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable) + +##### (4) 持久性(**D**urability) + +* 事务处理结束后,**对数据的修改就是永久的**,即便系统故障也不会丢失 + -- Gitee