SQL事务与ADO.NET事务
1 SQL事务
sql事务是使用SQL server自身的事务:在存储过程中直接使用Begin Tran,Rollback Tran,Commit Tran实现事务:
优点:执行效率最佳
限制:事务上下文仅在数据库中调用,难以实现复杂的业务逻辑。
Demo:(所有demo,都以SQL Server自带的Northwind数据的表Region为例)
带事务的储存过程:
CREATE PROCEDURE dbo.SPTransaction
(
@UpdateID int,
@UpdateValue nchar(50),
@InsertID int,
@InsertValue nchar(50)
)
AS
begin Tran
Update Region Set RegionDescription=@UpdateValue where RegionID=@UpdateID
insert into Region Values (@InsertID,@InsertValue)
declare @RegionError int
select @RegionError=@@error
if(@RegionError=0)
COMMIT Tran
else
ROLLBACK Tran
GO
执行带事务的储存过程:
/// <summary>
/// SQL事务:
/// </summary>
public void SQLTran()
{
SqlConnection conn = new SqlConnection("Data Source=127.0.0.1;Initial Catalog=Northwind;Persist Security Info=True;User ID=sa;Password=123;");
SqlCommand cmd = new SqlCommand();
cmd.CommandText = "SPTransaction";
cmd.CommandType = CommandType.StoredProcedure;
cmd.Connection = conn;
conn.Open();
SqlParameter[] paras= new SqlParameter[]{
new SqlParameter ("@UpdateID",SqlDbType.Int,32),
new SqlParameter ("@UpdateValue",SqlDbType .NChar,50),
new SqlParameter ("@InsertID",SqlDbType.Int ,32),
new SqlParameter ("@InsertValue",SqlDbType.NChar ,50)};
paras[0].Value = "2";
paras[1].Value = "Update Value1";
paras[2].Value = "6";
paras[3].Value = "Insert Value1";
foreach (SqlParameter para in paras )
{
cmd.Parameters.Add(para);
}
cmd.ExecuteNonQuery();
}
2 ADO.net事务
Ado.net事务可能是大家一般都用的
优点:简单,效率和数据库事务差不多。
缺点:事务不能跨数据库,只能在一个数据库连接上。如果是两个数据库上就不能使用该事务了。
Demo:
/// <summary>
/// 一般的ADO.net 事务
/// </summary>
public void ADONetTran1()
{
SqlConnection conn = new SqlConnection("Data Source=127.0.0.1;Initial Catalog=Northwind;Persist Security Info=True;User ID=sa;Password=123;");
SqlCommand cmd = new SqlCommand();
try
{
cmd.CommandText = "Update Region Set RegionDescription=@UpdateValue where RegionID=@UpdateID";
cmd.CommandType = CommandType.Text;
cmd.Connection = conn;
conn.Open();
SqlParameter[] paras = new SqlParameter[]{
new SqlParameter ("@UpdateID",SqlDbType.Int,32),
new SqlParameter ("@UpdateValue",SqlDbType .NChar,50)};
paras[0].Value = "2";
paras[1].Value = "Update Value12";
foreach (SqlParameter para in paras)
{
cmd.Parameters.Add(para);
}
//开始事务
cmd.Transaction = conn.BeginTransaction();
cmd.ExecuteNonQuery();
cmd.CommandText = "insert into Region values(@InsertID,@InsertValue)";
cmd.CommandType = CommandType.Text;
paras = new SqlParameter[]{
new SqlParameter ("@InsertID",SqlDbType.Int ,32),
new SqlParameter ("@InsertValue",SqlDbType.NChar ,50)};
paras[0].Value = "7";
paras[1].Value = "Insert Value";
cmd.Parameters.Clear();
foreach (SqlParameter para in paras)
{
cmd.Parameters.Add(para);
}
cmd.ExecuteNonQuery();
//提交事务
cmd.Transaction.Commit();
}
catch
{
//回滚事务
cmd.Transaction.Rollback();
throw;
}
finally
{
conn.Close();
}
}
转载于:https://www.cnblogs.com/chenbg2001/archive/2010/04/22/1717910.html
SQL事务与ADO.NET事务相关推荐
- 在.net 2.0 中执行分布式事务:隐式事务篇(SQL Server 与 Oracle)
项目涉及到多个数据库的查询更新操作,也就必然需要分布式事务的支持,查了MSDN知道 .net 2.0 中利用新增的 System.Transactions 命名空间可以简单的实现分布式事务: Syst ...
- SQL Server 数据库之使用事务
使用事务 1. 开始事务 2. 结束事务 3. 回滚事务 4. 事务的工作机制 5. 自动提交事务 6. 事务的并发问题 6.1 脏读 6.2. 不可重复读 6.3. 幻读 7. 事务的隔离级别 7. ...
- 执行多条SQL语句,执行数据库事务(可传入Sql参数)
上篇博客,实例介绍了一个事务执行多条SQL语句函数(int ExecuteSqlTran(List<String> SQLStringList))点击打开链接,方便之余又发现了它的缺陷-- ...
- 【概念原理】四种SQL事务隔离级别和事务ACID特性
2019独角兽企业重金招聘Python工程师标准>>> 事务是一组读写操作,并且具有只有所有操作都成功才算成功的特性. 事务隔离级别 SQL事务隔离级别由弱到强分别是:READ_UN ...
- mysql事务日志备份_事务日志备份 (SQL Server)
事务日志备份 (SQL Server)Transaction Log Backups (SQL Server) 01/05/2018 本文内容 适用于:Applies to: SQL ServerSQ ...
- sql 在存储过程中使用事务(转)
本来想自己写一下,后来发现这个写的比我理解的要好,所以直接拽过来了,链接地址:https://www.cnblogs.com/RascallySnake/archive/2010/05/17/1737 ...
- SQL FILESTREAM数据库中的事务日志备份
In the continuation of our SQL FILESTREAM article series, we'll be covering transaction log backups ...
- 转:SQL进阶之变量、事务、存储过程与触发器
一.变量那点事儿 1.1 局部变量 (1)声明局部变量 DECLARE @变量名 数据类型 DECLARE @name varchar(20) DECLARE @id int (2)为变量赋值 SET ...
- oracle数据库事务日志已满,SQL Server中已满事务日志原因的检测(上)
对于SQL Server数据库管理员来讲,已满事务日志是一个琐碎的,但又很常见的问题.它能引发事务的提前终止,甚至通过阻止所有事务的引入,从而引起系统的崩溃.对于数据库管理员来说,关键是理解将要发生的 ...
最新文章
- 【译】如何精确判断最终用户响应时间过长的原因?
- loop设备做LVM
- mysql导出二进制日志_使用mysqlbinlog提取二进制日志
- Java并发教程– CountDownLatch
- 【转】Mac本地生成SSH Key 的方法
- WSGI Application/Framework
- 【注意力机制】一系列关于attention的高效改进大集合
- Excel 2016中的新增函数之SWITCH
- Halcon教程十三:图像预处理
- 阿里云平台购买域名 域名配置 域名解析步骤
- linux内存显示少,linux 显示的内存怎么少于我实际的物理内存
- [图形计算器]Desmos
- 表格内容相同单元格合并
- 搜狗微信APP逆向(二)so层
- STP怎么选根桥和根端口
- 【VBA研究】保存和打开Excel文件的代码
- c语言读取一行的前几个字符串,c语言读取文件某一列 c语言 读取文件中某一行的前一行...
- 第7.12节 可共享的Python类变量
- 关于线性插值的一点理解
- 织梦dede建站仿站入门到精通
热门文章
- Activity管理类,随时随地退出应用程序
- 因果推断与反事实预测——几篇关联论文(二十六)
- caffe+GAN︱PPGN生成模型5则官方案例(caffe版)
- 表格开源的数据集FUSD数据集、TableBank数据集、DocBank数据集
- 52、基于模块化方式安装LAMP
- riot.js教程【二】组件撰写准则、预处理器、标签样式和装配方法
- 行存、列存,堆表、AO表性能对比 - 阿里云HDB for PostgreSQL最佳实践
- USB2.0学习笔记连载(四):安装Cypress官网套件
- Win10文件管理器那些你不知道的秘密
- org.hibernate.NonUniqueObjectException: