SqlTransaction事务的用法
SqlTransaction事务的用法
SqlTransaction事务的用法transaction事务
事务(Transaction)是并发控制的单位,是用户定义的一个操作序列。这些操作要么都做,要么都不做,如果某一事务成功,则在该事务中进行的所有数据更改均会提交,成为数据库中永久的组成部分。若果事务遇到错误,则必须取消或回滚,所有数据均被更改清除。通过事务,SQL Server能将逻辑相关的一组操作绑定在一起,以便服务器保持数据的完整性。
transaction属性:
1.原子性:事务是一个完整的操作,事务的各元素师不可分的。
2.一致性:事务开始时和完成时,数据必须处于一致的状态。
3.隔离性:对数据进行修改的所有并发事务是彼此隔离的。
4.持久性:事务完成后,它对系统的影响是永久的。
使用SqlTransaction实现数据库操作事务
SqlTransaction类是对SQL Server数据库进行事务处理的类,该类的实例由SqlConnection类实例的BeginTransaction方法创建,表示在该数据库连接实例上开始一个数据库事务,创建SqlTransaction类实例后,在程序中使用该实例的Commit方法提交事务,或者使用该类的Rollback方法回滚事务。
SqlTransaction示例
下面的示例创建一个 SqlConnection 和一个 SqlTransaction。此示例演示如何使用BeginTransaction、Commit 和 Rollback 等方法。出现任何错误时事务都会回滚。Try/Catch 错误处理用于处理尝试提交或回滚事务时的所有错误。
using System;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using CNTVS.TOOLS;
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void Button1_Click(object sender, EventArgs e)
{
SqlConnection conn = Database.GetConn();
SqlTransaction st = conn.BeginTransaction();
try
{
string sql = "Insert Into T_Test(F_Name) values('A')";
Database.ExecuteNonQuery(st, CommandType.Text, sql);
//这里会报错,在挂起的事务中,该事务分配的连接,不能再独占使用
//string A = Database.ExecuteScalarToStr(conn,CommandType.Text,"Select F_ID From T_Test where F_Name='A'");
sql = "Insert Into T_Test2(F_ID,F_Age) values(1,2)";
Database.ExecuteNonQuery(st, CommandType.Text, sql);
st.Commit();
}
catch (Exception Ex)
{
st.Rollback();
Website.WriteError(Ex);
}
finally
{
Database.Dispose(conn);
}
}
}
注意:在提交或回滚 SqlTransaction 时,应始终使用 Try/Catch 进行异常处理。如果连接终止或事务已在服务器上回滚,则Commit 和Rollback 都会生成InvalidOperationException
事务的误区
事务有很多优点【原理中已经阐述】,由于它的要求比较高,所以注意事务不能滥用,如果用不好就会造成很大的麻烦。
事务有一个开头和一个结尾,它们指定了事务的边界,事务在其边界之内可以跨越进程和计算机。事务边界内的所有资源都参与同一个事务。要维护事务边界内资源间的一致性,事务必须具备 ACID 属性,即原子性、一致性、隔离性和持续性。这是MSDN的权威说明。
也许针对一般的小逻辑、小数据事务应用非常的高效、可靠。但如果数据量很大,在单个事务中集合的操作繁多而且复杂,事务的致命伤就会暴露出来。一个事务进行时,必须保证边界资源的原子性、一致性、隔离性和持续性。
我曾经设计了一个测试用例,测试事务在执行时对资源的利用情况。测试结果很令人惊讶:在事务执行时,独占事务涉及到的数据表,造成其它操作词表的功能,因等待时间过长,而暴跳“获得数据连接超时”的警告。
- ASP.NET Web API中参数的传递
- ASP.NET参数化查询
- asp.net将Excel文档转换成pdf
- php 与asp对比(asp.net和php的区别点总结)
- asp.net使用swfupload上传
- ASP.NET抓取网页内容
- asp.net如何实现word文档在线预览
- ASP.NET的Random随机数
- ASP.NET压力测试
- asp.net MVC处理流程
- ASP.NET中XML和JSON互转
- ASP.NET文件打包压缩下载
- asp.net 文件操作
- windowsserver2008部署php项目(win2008 r2 服务器环境配置FTP/ASP/ASP.Net/PHP)
- ASP.NET参数化模糊查询
- ASP.NET批量下载文件
- 红色代表什么(红色代表什么情感和含义)
- 南宋志南和尚绝句 杨柳风似庙中来(南宋志南和尚绝句)
- 今天要穿什么颜色(今天要穿什么颜色的衣服最吉利)
- 一道高中题-求杯子的高度(一道高中题-求杯子的高度)
- 网坛停摆三巨头亏损惨重,费德勒跌幅88 纳达少赚2400万(网坛停摆三巨头亏损惨重)
- Beyond 版本《无人深空》主线任务攻略 阿特拉斯之道(版本无人深空主线任务攻略)
热门推荐
- python class转json(Python对象转换为json的方法步骤)
- 如何排查mysql存储过程的问题(Mysql修改存储过程相关权限问题)
- php数组取值方法(php给数组赋值的实例方法)
- sql server 视图操作(Sql Server 视图数据的增删改查教程)
- docker中的mongodb(Docker mongoDB 4.2.1 安装并收集springboot日志的步骤详解)
- sqlserver怎么写判断条件(SQL Server之SELECT INTO 和 INSERT INTO SELECT案例详解)
- html5播放代码(html5 video全屏播放/自动播放的实现示例)
- html5游戏新手引导开发(使用数据结构给女朋友写个Html5走迷宫游戏)
- jscanvas画折线图(js+canvas实现代码雨效果)
- vue本地图片切换(vue动态加载本地图片的处理方法)