SQL 事务 (存储过程与事务)
来源:互联网 发布:智能对话机器人软件 编辑:程序博客网 时间:2024/05/20 03:38
实例1
C# 执行SQL事务 又两种方法(本人总结的)
1.通过存储过程。 现在就演示一下通过存储过程来执行SQL事务。
2.通过C#中提供的 Transaction 。
平常我们在sql server里面执行一条insert语句,执行完毕后,我们也没有手动执行commit来提交事务,可是它却将数据插入到数据库中了,这是为什么呢? 答案:那是因为sql server默认是自动提交事务,当你执行一条sql 语句的时候,如果执行成功,它就自动给你commit来提交事务了,如果失败了就自动给你回滚了
SQL Server 事务语法
Sql server 事务的两种用法
<1>创建一个存储过程,
use sales --指定数据库create table bb --创建bb 这个表(ID int not null primary key ,--账号Moneys money --转账金额)--bb表里插入两条数据insert into bb values('1',2000) --账户 1 里有2000元insert into bb values('2',3000) --账户 2 里有3000元goif(exists(select * from sys.objects where name='proc_bb')) --如果存储这条存储过程存在则先删除drop proc Proc_bbgocreate proc Proc_bb --创建名字为Proc_bb的存储过程 带3个参数(@fromID int, --转出账户@toID int, --接收转账的账户@momeys money --转账金额)asbegin tran --开始执行事务update bb set Moneys=Moneys-@momeys where ID=@fromID ---执行的第一个操作,转账 原来的金额-转账的金额update bb set Moneys=Moneys+@momeys where ID=@toID --执行第二个操作,接受转账 原来的的金额+转账的金额if @@ERROR<>0 --判断 如果两条语句有任何一条出现错误。(如果前面的SQL 语句执行没有错误,则返回0)beginrollback tran --开始执行事务的回滚,恢复转账开始之前的状态return 0endelse --如果两个语句都执行成功begin commit tran --执行这个事务的操作endgoexec Proc_bb 1,2 ,2000 --执行这条存储过程; 转账账户为 1 接收账户为 2 转账的金额为 2000元
在C#中执行上面这个存储过程
WebForm2.aspx.cs页面
using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.UI;using System.Web.UI.WebControls;using System.Configuration;using System.Data.SqlClient;namespace 用户激活{ public partial class WebForm2 : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { } protected void Button1_Click(object sender, EventArgs e) { string connStr=ConfigurationManager.ConnectionStrings["ConnStr"].ConnectionString; using (SqlConnection conn = new SqlConnection(connStr)) { conn.Open(); using (SqlCommand cmd = conn.CreateCommand()) { //SqlParameter sqlParameter=new SqlParameter(); SqlParameter [] sqlParameters={ new SqlParameter("@toID",ToID.Text.Trim()), new SqlParameter("fromID",FromID.Text.Trim()), new SqlParameter("@money",Money.Text.Trim()) }; cmd.CommandText = "exec Proc_bb @toID, @fromID, @money"; cmd.Parameters.AddRange(sqlParameters); int i= cmd.ExecuteNonQuery(); if (i > 0) { Msg.Text = "转账成功"; } else { Msg.Text = "转账失败"; } } } } }}
WebForm2.aspx页面
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm2.aspx.cs" Inherits="用户激活.WebForm2" %><html xmlns="http://www.w3.org/1999/xhtml"><head runat="server"> <title></title></head><body> <form id="form1" runat="server"> 转账账户:<asp:TextBox ID="ToID" runat="server"></asp:TextBox></br> 接收账户:<asp:TextBox ID="FromID" runat="server"></asp:TextBox></br> 转账金额:<asp:TextBox ID="Money" runat="server"></asp:TextBox></br> 转账是否成功:<asp:Label ID="Msg" runat="server" Text=""></asp:Label></br> <asp:Button ID="Button1" runat="server" Text="提交转账" onclick="Button1_Click" /> </form></body></html>
================================================================
实例2
首先在数据库建立一个表,表名为bank,并插入了两句数据
现在给这个bank表的balance列添加一个约束,规定balance列的值必须大于10
alter table bankadd constraint ck_balance check(balance >10)好了,那现在我们来手动开启一个事务,模拟转账
begin tran --手动开启一个事务declare @sumErrors int=0 --声明一个变量,给它赋初始值为0update bank set balance=balance-200 where cid='0001'--立刻验证上面那句代码是否执行成功了。(如果代码执行成功@Error为0,不成功@Error则为错误码)set @sumErrors=@sumErrors+@@Errorupdate bank set balance=balance+200 where cid='0002'--立刻验证上面那句代码是否执行成功了。(如果代码执行成功@Error为0,不成功@Error则为错误码)set @sumErrors=@sumErrors+@@Errorif(@sumErrors<>0) --如果上面的两条update语句只要有其中一条执行失败,@sumErrors都将不会等于0begin rollback tran --回滚endelsecommit --如果@sumErrors等于0,即两条update语句都执行成功。就提交事务
注意:这里我为什么要独立声明一个@sumErrors, 而不是直接使用@@ERROR全局变量来判断两条语句是否执行成功。
具体请参考:SQL Server 中关于 @@error 的一个小误区
0 0
- SQL 事务 (存储过程与事务)
- Sql 存储过程 事务
- 存储过程与事务
- 存储过程与事务
- 存储过程与事务
- [SQL server]存储过程事务(模板)
- sql server (存储过程,事务)联系
- SQL 存储过程入门(事务)
- [SQL server]存储过程事务
- [SQL server]存储过程事务
- [sql server]存储过程事务
- [SQL server]存储过程事务
- sql事务和存储过程
- sql 存储过程中的事务
- SQL Server 存储过程事务
- [SQL server]存储过程事务
- 事务实例sql 存储过程
- sql事务和存储过程
- Hibernate4实战 之 第一部分 Hibernate入门
- HDU2097 Sky数【水题】
- simple-spring-memcached 注解配置
- ThinkPHP框架中的U方法分析
- 判定鼠标点击某一控件
- SQL 事务 (存储过程与事务)
- 反序列化无法找到程序集(转载)
- 扩展软件包package feeds详细说明
- Java中的SoftReference
- java发送http请求
- LabVIEW关于数值显示控件增加单位的显示设置
- oracle 11g r2 RAC linux 6.4 x86_64 .
- C# 对象、文件与二进制串(byte数组)之间的转换
- 语音编码算法AMR NB , AMR WB 和AMR WB+的区别