排名
6
文章
6
粉丝
16
评论
8
{{item.articleTitle}}
{{item.blogName}} : {{item.content}}
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:
50010702506256
50010702506256
欢迎加群交流技术
分类:
数据库
事务:把所有的操作当中一个整体,要么全部成功,要么全部失败
一旦开启了事务所有的操作都是临时的,你可以选择提交或者回滚
提交事务:全部成功
回滚事务:全部失败
事务特性(ACID):
事务具有原子性,一致性,隔离性,持久性(ACID)
A 原子性:事务必须是一个自动工作的单元,要么全部执行,要么全部不执行。
C 一致性:事务把数据库从一个一致状态带入到另一个一致状态,事务结束的时候,所有的内部数据都是正确的。
I 隔离性:并发多个事务时,一个事务的执行不受其他事务的影响。
D 持久性:事务提交之后,数据是永久性的,不可再回滚,不受关机等事件的影响。
事务的步骤:
1:开启事务 begin trans/transaction 事务名称
2:提交事务 commit trans/transaction 事务名称
3: 回滚事务 rollback trans/transaction 事务名称
出现异常事务会自动回滚
来简单模拟一个银行转账的例子:
测试表:
create Table Account ( Id int primary key identity(1,1), MyMoney int, AccountNumber nvarchar(64) ) select *from Account insert Account values(1000,'60023') insert Account values(1000,'60025') update Account set MyMoney =1000
方法1:
alter proc proc_transmoney(@myAccountNumber nvarchar(64),@outAccountNumber nvarchar(64),@money int)
as
begin
begin tran trans_money
begin try
if(@money=0)
begin
print('转账金额必须大于0')
commit tran trans_money
return
end
--验证转入账号是否存在
declare @count int
select @count = COUNT(*) from Account where AccountNumber = @myAccountNumber
if(@count=0)
begin
print('你的账号输入错误,转账失败')
--提交事务(只是为了事务完整)
commit tran trans_money
return
end
select @count = COUNT(*) from Account where AccountNumber = @outAccountNumber
if(@count=0)
begin
print('对方账号输入错误,转账失败')
--提交事务(只是为了事务完整)
commit tran trans_money
return
end
--验证余额
declare @lastMoney int
select @lastMoney = MyMoney from Account where AccountNumber = @myAccountNumber
if(@money>@lastMoney)
begin
print('你的余额不足,转账失败。你的余额为:'+cast(@lastMoney as varchar))
commit tran trans_money
return
end
update Account set MyMoney = MyMoney-@money where AccountNumber = @myAccountNumber
update Account set MyMoney = MyMoney+@money where AccountNumber =@outAccountNumber
commit tran trans_money
print('转账成功')
end try
--当异常出现的时候会执行
begin catch
print('转账出现错误,转账失败')
--回滚事务
rollback tran trans_money
end catch
end方法2:
alter proc proc_transmoney(@myAccountNumber nvarchar(64),@outAccountNumber nvarchar(64),@money int,@num1 nvarchar(64) out)
as
begin
begin tran trans_money
begin try
if(@money=0)
begin
print('转账金额必须大于0')
commit tran trans_money
return
end
--验证转入账号是否存在
declare @count int
--验证余额
declare @lastMoney int
select @lastMoney = MyMoney from Account where AccountNumber = @myAccountNumber
if(@money>@lastMoney)
begin
set @num1=('你的余额不足,转账失败。你的余额为:'+cast(@lastMoney as varchar))
commit tran trans_money
return
end
update Account set MyMoney = MyMoney-@money where AccountNumber = @myAccountNumber
if(@@ROWCOUNT=0)
begin
set @num1=('你的账号输入错误,转账失败')
rollback tran trans_money
return
end
update Account set MyMoney = MyMoney+@money where AccountNumber =@outAccountNumber
if(@@ROWCOUNT=0)
begin
set @num1=('对方的账号输入错误,转账失败')
rollback tran trans_money
return
end
commit tran trans_money
set @num1=('转账成功')
end try
--当异常出现的时候会执行
begin catch
set @num1=('转账出现错误,转账失败')
--回滚事务
rollback tran trans_money
end catch
endc#执行这个存储过程,这里就简单的直接执行的
:
static void Main(string[] args)
{
SqlConnection conn = new SqlConnection("server=.;uid=sa;pwd=123456;database=oa");
conn.Open();
SqlCommand com = new SqlCommand();
//给命令指定一个连接对象
com.Connection = conn;
//设置命令的类型为存储过程
com.CommandType = System.Data.CommandType.StoredProcedure;
//指定存储过程的名字
com.CommandText = "proc_transmoney";
Console.WriteLine("请输入你的账号");
string myAccount = Console.ReadLine();
//你的账号
SqlParameter myAccountNumber = new SqlParameter("myAccountNumber", myAccount);
com.Parameters.Add(myAccountNumber);
Console.WriteLine("请输入对方的账号");
string outAccount = Console.ReadLine();
//对方的账号
com.Parameters.AddWithValue("outAccountNumber", outAccount);
//转账的金额
Console.WriteLine("请输入转账的金额");
string myMoney = Console.ReadLine();
com.Parameters.AddWithValue("money", myMoney);
SqlParameter sqlParameter = new SqlParameter();
//参数类型
sqlParameter.SqlDbType = System.Data.SqlDbType.NVarChar;
//指定参数大小
sqlParameter.Size = 256;
//参数方向,输出还是输入
sqlParameter.Direction = System.Data.ParameterDirection.Output;
sqlParameter.ParameterName = "num1";
com.Parameters.Add(sqlParameter);
//执行
com.ExecuteReader();
Console.WriteLine(sqlParameter.Value);
}欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739。有需要软件开发,或者学习软件技术的朋友可以和我联系~(Q:815170684)
评价