应无所住,而生其心
排名
1
文章
860
粉丝
112
评论
163
net core webapi post传递参数
庸人 : 确实坑哈,我也是下班好了好几次,发现后台传递对象是可以的,但...
百度编辑器自定义模板
庸人 : 我建议换个编辑器,因为现在百度富文本已经停止维护了,用tinymec...
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术

sqlserver事务

5856人阅读 2020/5/21 17:20 总访问:5194828 评论:0 收藏:0 手机
分类: 数据库

事务:把所有的操作当中一个整体,要么全部成功,要么全部失败

      一旦开启了事务所有的操作都是临时的,你可以选择提交或者回滚

      提交事务:全部成功

      回滚事务:全部失败


事务特性(ACID):

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


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

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

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

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


事务的步骤:


   1:开启事务  begin       trans/transaction      事务名称

   2:提交事务  commit      trans/transaction      事务名称

   3: 回滚事务  rollback    trans/transaction   事务名称


   出现异常事务会自动回滚



来简单模拟一个银行转账的例子:

测试表:

  1.   create Table Account
  2.   (
  3.     Id int primary key identity(1,1),
  4.     MyMoney int,
  5.     AccountNumber nvarchar(64
  6.   )
  7.   
  8.   select *from Account
  9.   
  10.   insert Account values(1000,'60023')  
  11.   insert Account values(1000,'60025')
  12.   
  13.   update Account set MyMoney =1000



方法1:

  1. alter proc proc_transmoney(@myAccountNumber nvarchar(64),@outAccountNumber nvarchar(64),@money int)
  2. as
  3. begin
  4.   begin tran trans_money
  5.   
  6.     begin try 
  7.       
  8.       if(@money=0)
  9.       begin
  10.         print('转账金额必须大于0')     
  11.         commit tran trans_money
  12.         return 
  13.       end
  14.       
  15.       
  16.       --验证转入账号是否存在
  17.       declare @count int 
  18.       select @count = COUNT(*) from Account where AccountNumber = @myAccountNumber 
  19.       if(@count=0)
  20.       begin
  21.         print('你的账号输入错误,转账失败')     
  22.         --提交事务(只是为了事务完整)
  23.         commit tran trans_money
  24.         return 
  25.       end
  26.           
  27.       select @count = COUNT(*) from Account where AccountNumber = @outAccountNumber 
  28.       if(@count=0)
  29.       begin
  30.         print('对方账号输入错误,转账失败')     
  31.         --提交事务(只是为了事务完整)
  32.         commit tran trans_money
  33.         return 
  34.       end
  35.       
  36.       --验证余额
  37.       declare @lastMoney int
  38.       select @lastMoney = MyMoney from Account where AccountNumber = @myAccountNumber 
  39.       if(@money>@lastMoney)
  40.       begin
  41.          print('你的余额不足,转账失败。你的余额为:'+cast(@lastMoney as varchar))     
  42.         commit tran trans_money
  43.         return 
  44.       end
  45.       
  46.          
  47.     
  48.       update Account set MyMoney = MyMoney-@money where AccountNumber = @myAccountNumber   
  49.       update Account set MyMoney = MyMoney+@money where AccountNumber =@outAccountNumber 
  50.       commit tran trans_money 
  51.       print('转账成功')
  52.     end try
  53.     
  54.     --当异常出现的时候会执行
  55.     begin catch
  56.        print('转账出现错误,转账失败')
  57.        --回滚事务
  58.        rollback tran trans_money
  59.     end catch 
  60. end

方法2:

  1. alter proc proc_transmoney(@myAccountNumber nvarchar(64),@outAccountNumber nvarchar(64),@money int,@num1 nvarchar(64out)
  2. as
  3. begin
  4.   begin tran trans_money
  5.   
  6.     begin try 
  7.       
  8.       if(@money=0)
  9.       begin
  10.         print('转账金额必须大于0')     
  11.         commit tran trans_money
  12.         return 
  13.       end
  14.           
  15.       --验证转入账号是否存在
  16.       declare @count int 
  17.          
  18.       --验证余额
  19.       declare @lastMoney int
  20.       select @lastMoney = MyMoney from Account where AccountNumber = @myAccountNumber 
  21.       if(@money>@lastMoney)
  22.       begin
  23.       
  24.         set @num1=('你的余额不足,转账失败。你的余额为:'+cast(@lastMoney as varchar))     
  25.         commit tran trans_money
  26.         return 
  27.       end
  28.               
  29.       update Account set MyMoney = MyMoney-@money where AccountNumber = @myAccountNumber   
  30.       if(@@ROWCOUNT=0)
  31.       begin
  32.         set @num1=('你的账号输入错误,转账失败')     
  33.         rollback tran trans_money
  34.         return 
  35.       end
  36.            
  37.       update Account set MyMoney = MyMoney+@money where AccountNumber =@outAccountNumber 
  38.       
  39.       if(@@ROWCOUNT=0)
  40.       begin
  41.         set @num1=('对方的账号输入错误,转账失败')     
  42.         rollback tran trans_money
  43.         return 
  44.       end
  45.       
  46.       commit tran trans_money 
  47.      set @num1=('转账成功')
  48.     end try
  49.     
  50.     --当异常出现的时候会执行
  51.     begin catch
  52.        set @num1=('转账出现错误,转账失败')
  53.        --回滚事务
  54.        rollback tran trans_money
  55.     end catch 
  56. end

c#执行这个存储过程,这里就简单的直接执行的

  1. static void Main(string[] args)
  2.         {
  3.             SqlConnection conn = new SqlConnection("server=.;uid=sa;pwd=123456;database=oa");
  4.             conn.Open();
  5.             SqlCommand com = new SqlCommand();
  6.             //给命令指定一个连接对象
  7.             com.Connection = conn;
  8.             //设置命令的类型为存储过程
  9.             com.CommandType = System.Data.CommandType.StoredProcedure;
  10.             //指定存储过程的名字
  11.             com.CommandText = "proc_transmoney";
  12.             Console.WriteLine("请输入你的账号");
  13.             string myAccount = Console.ReadLine();
  14.             //你的账号
  15.             SqlParameter myAccountNumber = new SqlParameter("myAccountNumber", myAccount);
  16.             com.Parameters.Add(myAccountNumber);
  17.             Console.WriteLine("请输入对方的账号");
  18.             string outAccount = Console.ReadLine();
  19.             //对方的账号
  20.             com.Parameters.AddWithValue("outAccountNumber", outAccount);
  21.             //转账的金额
  22.             Console.WriteLine("请输入转账的金额");
  23.             string myMoney = Console.ReadLine();
  24.             com.Parameters.AddWithValue("money", myMoney);
  25.  
  26.             
  27.             SqlParameter sqlParameter = new SqlParameter();
  28.             //参数类型
  29.             sqlParameter.SqlDbType = System.Data.SqlDbType.NVarChar;
  30.             //指定参数大小
  31.             sqlParameter.Size = 256;
  32.             //参数方向,输出还是输入
  33.             sqlParameter.Direction = System.Data.ParameterDirection.Output;
  34.             sqlParameter.ParameterName = "num1";
  35.             com.Parameters.Add(sqlParameter);
  36.             //执行
  37.             com.ExecuteReader();
  38.             Console.WriteLine(sqlParameter.Value);
  39.         }


欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739。有需要软件开发,或者学习软件技术的朋友可以和我联系~(Q:815170684)

评价

sqlserver order by

order by 字段名order by 第几个字段(整形)order by 排序:order by 字段名:通过字段名指定的字段排序 order by 字段数...

sqlserver保障远程连接的安全性

如果是只读的话建个视图,建个普通用户只对该视图进行读。读写的话就只能自己在加一层代理服务,由代理来进行读写,各客户...

sqlserver约束

添加表后操作约束--删除约束 altertableaj_testdropconstraintCK__aj_test__userAge__5EBF139D --为表aj_test添加默认...

sqlserver存储过程拼接sql语句,分页

在写有些存储过程的时候需要进行sql的拼接,然后在使用exec函数执行sql语句注意字符串的拼接,看下面一段存储过程的sql语句...

sqlserver常用操作

创建临时表createtable#表名() select字段1,字段2....字段ninto#表名from表[where1=1]删除临时表ifOBJECT_ID('tempdb....

Serilog日志记录到sqlserver以及其中存在的问题

1.首先来一大串的安装Install-PackageSerilog //控制台输出 Install-PackageSerilog.Sinks.Console //文件输出 Install...

sqlserver监控sql语句

首先在工具中打开sql server profiler然后登录一下这里可以进行一些常规的筛选,不然监控的sql语句很多的右下方还可以进行...

sqlserver数据库+DBHelper

原始的ASP.NET数据库查询,所需要的帮助类publicclassDBHelper {//创建全局对象 staticSqlConnectionconn=newSqlConnecti...

Core使用codefirst创建sqlserver数据库

1.先添加以下程序包Install-PackageMicrosoft.EntityFrameworkCore Install-PackageMicrosoft.EntityFrameworkCore.SqlSer...

sqlserver ROW_NUMBER 分页

很简单的一个sql语句根据行号分页即可 select * from (select *,ROW_NUMBER() over(order by id) as rownumber from[dbo]....

sqlserver跨库复制表

sql语句:select*intoResourcefromXJ.[dbo].[Resource]注意主键、外键、约束、触发器、索引都不会被复制,只是数据会被复制...

sqlserver基础查询

select top 1 from table1 //————返回表中第一条数据 select top 10 percent * from table1 //...

sqlserver存储过程

什么是存储过程: 预编译的sql语句,可以放很多sql语句,里边可以写条件,循环,可以把一些逻辑放到存储过程里边处理 比如...

sqlserver函数

函数系统自带函数(avg,sum,min,max,count),用户自定义函数 系统分类:表值函数,标量值函数,聚合函数 函数语法:函数必...

sqlserver触发器

触发器什么是触发器:触发器是个特殊的存储过程,不是由用户触发,是系统根据事件来触发。对表操作比如 添加,删除,...