排名
7
文章
192
粉丝
15
评论
16
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:
50010702506256


欢迎加群交流技术

前言
事务可以做什么?
保持逻辑数据一致性与可恢复性
事务的特性:事务具有原子性,一致性,隔离性,持久性(ACID)
A 原子性:事务必须是一个自动工作的单元,要么全部执行,要么全部不执行。
C 一致性:事务把数据库从一个一致状态带入到另一个一致状态,事务结束的时候,所有的内部数据都是正确的。
I 隔离性:并发多个事务时,一个事务的执行不受其他事务的影响。
D 持久性:事务提交之后,数据是永久性的,不可再回滚,不受关机等事件的影响。
事务在如下情况终止:
遇到rollback 或commit命令
遇到DDL或者DCL语句.
系统发生错误,崩溃或者退出。
事务分为三种:自动提交事务,显式事务,隐式事务
自动提交事务:
sqlserver每条Sql语句都被看成一个事务进行处理,例如一个update修改两个字段,不会出现一个成功一个失败,要么全部成功,要么全部失败
显式事务:
由Begin Transaction开启事务开始,由Commit Transaction 提交事务、Rollback Transaction 回滚事务结束
隐式事务:
使用Set IMPLICIT_TRANSACTIONS ON 将将隐式事务模式打开,不用Begin Transaction开启事务,当一个事务结束,
这个模式会自动启用下一个事务,只用Commit Transaction 提交事务、Rollback Transaction 回滚事务即可
常用的事务语句:
Begin Transaction:开启事务
Commit Transaction:提交事务
Rollback Transaction:回滚事务
Save Transaction:设置内部存储点,事务可以不全部回滚,只回滚到这里
定义一个事务
- --开启事务
- begin transaction _move
- begin
- --回滚事务
- rollback transaction _move
-
- --数据正确过后提交事务
- Commit Transaction _move
- end
模拟误删数据表(没回滚之前千万别提交事务)
进行删除这种危险操作的时候尽量带着事务,不然后悔莫及
- --模拟数据库误删回滚(必须要开启事务)
- begin transaction databasedelete
- drop table 表
-
- --回滚
- rollback transaction databasedelete
模拟转账
- --数据表
- create table rmb
- (
- id int primary key identity(1,1),
- sid varchar(10) ,
- money int check (money >=0)
- )
- insert rmb values('ns001',1000)
- insert rmb values('ns002',1000)
- insert rmb values('ns003',1000)
- insert rmb values('ns004',1000)
- insert rmb values('ns005',1000)
- insert rmb values('ns006',1000)
-
- --创建存储过程
- create proc Moneys
- as
- begin
- declare @c1 int ,@c2 int
- declare @n1 varchar(10) = 'ns001'
- declare @n2 varchar(10) = 'ns002'
- select @c1= count(*) from rmb where sid = @n1
- select @c2= count(*) from rmb where sid = @n2
-
- --开启事务
- begin transaction _move
- --判断数据是否异常
- if(@c1=0 or @c2=0)
-
- print('账号错误')
- --回滚事务
- rollback transaction _move
- end
- else
- begin
- update rmb set money = money + 100 where sid = @n1
- update rmb set money = money - 100 where sid = @n2
- --数据正确过后提交事务
- Commit Transaction _move
- print('转账成功')
- end
- end
- --调用存储过程
- execute Moneys;
评价