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 URLRewriter伪静态
- 为什么asp.net网站第一次加载慢
- asp.net将ppt文档转换成pdf
- ASP.NET给图片加图片水印
- ASP.NET中使用CodeDomProvider调用js文件中的js方法
- docker 部署netcore(关于Jenkins + Docker + ASP.NET Core自动化部署的问题避免踩坑)
- ASP.NET实现多文件上传
- 2013-12-25
- asp.net文件下载的方法
- ASP.NET中异常处理的注意事项
- ASP.NET文件打包压缩下载
- ASP.NET SignalR是什么
- ASP.NET常用的代码收集
- ASP.NET中TimeSpan的用法
- ASP.NET身份验证方式
- asp.net lambda表达式
- 三分71 生死战爆发 篮网旧将丁威迪今天成奇兵,助队赢球(三分71生死战爆发)
- 《红 雄安》系列广播剧第一集 水上奇兵雁翎队(雄安系列广播剧第一集)
- 小说 小伙穿越成刘备,用现代知识指挥作战,众谋士都看呆了(小伙穿越成刘备)
- 解析葡萄牙6-1瑞士 进攻多点开花,贡萨洛-拉莫斯一战成名(解析葡萄牙6-1瑞士)
- 这支 奇兵队 腕大 有范儿还各怀绝技,毒贩杀人犯见了都要仓皇而逃(这支奇兵队腕大)
- 雄藩崛起 奇兵队与幕末长州藩军事改革(雄藩崛起奇兵队与幕末长州藩军事改革)
热门推荐
- 虚拟主机哪里有免备案(免备案云主机的真假鉴别)
- linux系统编程语法(简析Linux网络编程函数)
- mysql拆分成多行(mysql单字段多值分割和合并的处理方法)
- 自动化播放声音(video实现有声音自动播放的实现方法)
- sql server中实现split功能
- html5底部组件(HTML5 Blob对象的具体使用)
- sqlserver乐观锁与悲观锁(sql server中死锁排查的全过程分享)
- sql server 分布式事务(Sql Server事务语法及使用方法实例分析)
- html5怎么修改背景颜色(HTML5 body设置全屏背景图片的示例代码)
- python导出数据到mysql(python定时按日期备份MySQL数据并压缩)