菜的像徐坤
排名
6
文章
6
粉丝
16
评论
8
{{item.articleTitle}}
{{item.blogName}} : {{item.content}}
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2024TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术

sql事务

4420人阅读 2021/5/25 9:53 总访问:876681 评论:0 收藏:0 手机
分类: SQL

前言

事务可以做什么?
保持逻辑数据一致性与可恢复性

事务的特性事务具有原子性,一致性,隔离性,持久性(ACID)

  • A 原子性:事务必须是一个自动工作的单元,要么全部执行,要么全部不执行。

  • C 一致性:事务把数据库从一个一致状态带入到另一个一致状态,事务结束的时候,所有的内部数据都是正确的。

  • I 隔离性:并发多个事务时,一个事务的执行不受其他事务的影响。

  • D 持久性:事务提交之后,数据是永久性的,不可再回滚,不受关机等事件的影响。


事务在如下情况终止:

  1. 遇到rollback commit命令

  2. 遇到DDL或者DCL语句.

  3. 系统发生错误,崩溃或者退出。


事务分为三种:自动提交事务,显式事务,隐式事务
自动提交事务
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;


评价