Sql server 事务的两种用法
事务(Transaction)是并发控制的单位,是用户定义的一个操作序列。这些操作要么都做,要么都不做,是一个不可分割的工作单位。
通过事务,SQL Server能将逻辑相关的一组操作绑定在一起,以便服务器保持数据的完整性。
在sql server+ .net 开发环境下,有两种方法能够完成事务的操作,保持数据库的数据完整性;
一个就是用sql存储过程,另一个就是在ADO.NET中一种简单的事务处理;
现在通过一个典型的银行转账的例子来说明一下这两个例子的用法
我们先来看看sql存储过程是如何来完成事务的操作的:
首先创建一个表:
create database aaaa --创建一个表,包含用户的帐号和钱数
go
use aaaa
create table bb
(
ID int not null primary key, --帐号
moneys money --转账金额
)
insert into bb values ('1','2000') --插入两条数据
insert into bb values ('2','3000')
用这个表创建一个存储过程:
create procedure mon --创建存储过程,定义几个变量
@toID int, --接收转账的账户
@fromID int , --转出自己的账户
@momeys money --转账的金额
as
begin tran --开始执行事务
update bb set moneys=moneys-@momeys where ID=@fromID -执行的第一个操作,转账出钱,减去转出的金额
update bb set moneys=moneys+@momeys where ID=@toID --执行第二个操作,接受转账的金额,增加
if @@error<>0 --判断如果两条语句有任何一条出现错误
begin rollback tran –开始执行事务的回滚,恢复的转账开始之前状态
return 0
end
go
else --如何两条都执行成功
begin commit tran 执行这个事务的操作
return 1
end
go
接下来看看C#.net 是如何调用这个存储过程的:
protected void Button1_Click(object sender, EventArgs e)
{
SqlConnection con =new SqlConnection(@"Data Source=.\SQLEXPRESS;database=aaaa;uid=sa;pwd=jcx"); //连接字符串
SqlCommand cmd = new SqlCommand("mon",con); //调用存储过程
cmd.CommandType = CommandType.StoredProcedure;
con.Open();
SqlParameter prar = new SqlParameter();//传递参数
cmd.Parameters.AddWithValue("@fromID", 1);
cmd.Parameters.AddWithValue("@toID", 2);
cmd.Parameters.AddWithValue("@momeys",Convert.ToInt32( TextBox1.Text) );
cmd.Parameters.Add("@return", "").Direction = ParameterDirection.ReturnValue;//获取存储过程的返回值
cmd.ExecuteNonQuery();
string value = cmd.Parameters["@return"].Value.ToString();//把返回值赋值给value
if (value == "1")
{
Label1.Text = "添加成功";
}
else
{
Label1.Text = "添加失败";
}
}
这个也就是在存储过程里添加事务,再来看看不在数据库写sql存储过程,ADO.NET是如何处理事务的:
protected void Button2_Click(object sender, EventArgs e)
{
SqlConnection con = new SqlConnection(@"Data Source=.\SQLEXPRESS;database=aaaa;uid=sa;pwd=jcx");
con.Open();
SqlTransaction tran = con.BeginTransaction();//先实例SqlTransaction类,使用这个事务使用的是con 这个连接,使用BeginTransaction这个方法来开始执行这个事务
SqlCommand cmd = new SqlCommand();
cmd.Connection = con;
cmd.Transaction = tran;
try
{
//在try{} 块里执行sqlcommand命令,
cmd.CommandText = "update bb set moneys=moneys-'" + Convert.ToInt32(TextBox1.Text) + "' where ID='1'";
cmd.ExecuteNonQuery();
cmd.CommandText = "update bb set moneys=moneys+' aa ' where ID='2'";
cmd.ExecuteNonQuery();
tran.Commit();//如果两个sql命令都执行成功,则执行commit这个方法,执行这些操作
Label1.Text = "添加成功";
}
catch
{
Label1.Text = "添加失败";
tran.Rollback();//如何执行不成功,发生异常,则执行rollback方法,回滚到事务操作开始之前;
}
}
这就是两个事务不同用法的简单例子,ADO.NET 事务处理的方法看起来比较简单,但是他要使用同一个连接来执行这些操作,要是同时使用几个数据库来用一个事务执行,这样就比较繁琐,但是要是用sql存储过程,这样就相对比较简单,总之是两种方法各有各的优点。
Sql server 事务的两种用法的更多相关文章
- SQL SERVER中的两种常见死锁及解决思路
在sql server中,死锁都与一种锁有关,那就是排它锁(x锁).由于在同一时间对同一个数据库资源只能有一个数据库进程可以拥有排它锁.因此,一旦多个进程都需要获取某个或者同一个数据库资源的排它访问权 ...
- [SQL case when的两种用法]
当我们需要从数据源上 直接判断数据显示代表的含义的时候 ,就可以在SQL语句中使用 Case When这个函数了. Case具有两种格式.简单Case函数和Case搜索函数. 第一种 格式 : 简单C ...
- SQL Server事务的四种隔离级别
在SQL标准中定义了四种隔离级别,每一种级别都规定了一个事务中所做的修改,哪些是在事务内和事务间可见的,哪些是不可见的.较低级别的隔离通常可以执行更高的并发,系统的开销也更低. 1.未提交读(Read ...
- 连接sql server数据库的两种方式
class DB { private static SqlConnection conn; public static SqlConnection getConn() { //conn = n ...
- C# ASP.NET(配置数据库 sql server 地址的两种形式以及配置信息的获取)
( 1 ) 数据库装在本机,并且采用windows认证模式 <connectionStrings> <add name="SQLConnectionString&qu ...
- SQL Server验证的两种方式
1.Windows身份验证:本机连接或者受信的局域网连接(一般在忘记管理员密码或者做系统配置的情况下使用). 2.SQLServer验证:使用用户名.密码验证(推荐使用). 启用方法:以Windows ...
- SQL Server事务、隔离级别详解(二十九)
前言 事务一直以来是我最薄弱的环节,也是我打算重新学习SQL Server的出发点,关于SQL Server中事务将分为几节来进行阐述,Always to review the basics. 事务简 ...
- SQL Server 中的6种事务隔离级别简单总结
本文出处:http://www.cnblogs.com/wy123/p/7218316.html (保留出处并非什么原创作品权利,本人拙作还远远达不到,仅仅是为了链接到原文,因为后续对可能存在的一些错 ...
- 为什么说JAVA中要慎重使用继承 C# 语言历史版本特性(C# 1.0到C# 8.0汇总) SQL Server事务 事务日志 SQL Server 锁详解 软件架构之 23种设计模式 Oracle与Sqlserver:Order by NULL值介绍 asp.net MVC漏油配置总结
为什么说JAVA中要慎重使用继承 这篇文章的主题并非鼓励不使用继承,而是仅从使用继承带来的问题出发,讨论继承机制不太好的地方,从而在使用时慎重选择,避开可能遇到的坑. JAVA中使用到继承就会有两 ...
随机推荐
- android中ScrollView和GridView/ListView共存时,ScrollView不在顶部的解决方法
listView.setFocusable(false); gridView.setFocusable(false); 这个必须在代码中写,xml文件中设置不起作用 原文:http://stackov ...
- RHEL4-Partition Image系统备份(软件版)
对于BBS,或Apache,PHP等相关网页的程序 备份: 1)/var/www/html目录,里面有PHP所写成的网页.此网页主要功能是从资料库中读取由信件存入的文章,或是使用者选择由网页输入资料时 ...
- Linux菜鸟之路[4]-cal,date,bc,echo $LANG,man
由于前四天一直在看鸟哥的linux书本的计算机的一些基础知识,今天才接触基本的命令,从今天起每天记录一下自己的linux学习过程. cal:日历 cal: cal 2015:列出2015年所有日历 c ...
- JAVA实例变量的初始化过程
假设有这样一段代码: public class Cat { private String name; private int age; public String toString() { retur ...
- swith 语句详解
switch 语句的格式: switch ( 整型或字符型变量 ) { case 变量可能值1 : 分支一; break; case 变量可能值2 : 分支二; break; case 变量可 ...
- uva-699 Not so Mobile (杠杆,巧妙递归)
Not so Mobile Before being an ubiquous communications gadget, a mobile was just a structure made ...
- XMLHttpRequest对象的使用
1.首先要创建XMLHttpRequest对象,这个对象是前台与后台进行异步的重要对象,现在的浏览器有很多种,创建 XMLHttpRequest 的方法也不相同,所以为了兼容各种浏览器,在创建XMLH ...
- hud 2089 不要62 (数位dp)
#include<stdio.h> #include<string.h> #include<math.h> #define max 10 ]; int number ...
- POJ 3630 Phone List(trie树的简单应用)
题目链接:http://poj.org/problem?id=3630 题意:给你多个字符串,如果其中任意两个字符串满足一个是另一个的前缀,那么输出NO,否则输出YES 思路:简单的trie树应用,插 ...
- 技术是容易学会的(Copy)
1)自信第一.自信这东西很是奇怪,人有可能一开始会莫明其妙的自信,但一切都从这开始的.你觉得自己行你就一定会变得行,反之,如果觉得自已不行,那一定会不行.信心是我们转动飞轮的第一步,有了这一步我们的能 ...