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 MVC处理流程
- asp.net lambda表达式
- ASP.NET将Excel数据导入到数据库
- Asp.net中params的使用
- ASP.NET函数返回多个值的几种方法
- ASP.NET中Server对象的用法
- asp.net将Excel文档转换成pdf
- ASP.NET常见面试题
- ASP.NET根据IP获取省市地址
- ASP.NET中XML和JSON互转
- ASP.NET使用JavaScriptSerializer实现序列化与反序列化
- Asp.Net中索引器的用法
- ASP.NET压缩图片
- asp.net如何实现word文档在线预览
- asp.net网站如何优化
- 为什么asp.net网站第一次加载慢
- 各地出招烘 热 旅游(各地出招烘热旅游)
- 2021款起亚霸锐到店了 更换车标,竞争宝马X5有戏吗(2021款起亚霸锐到店了)
- 新款起亚霸锐实拍,比普拉多气派,配3.0T V6,引入国内或许能大卖(新款起亚霸锐实拍)
- ()
- 张勇 阿里新任掌门人(阿里新任掌门人)
- 毛戈平全国第一柜花落银泰 高端国货迎来 高光 时刻(毛戈平全国第一柜花落银泰)
热门推荐
- lnmp 自动化安装(LNMP系列教程之 设置301重定向的方法)
- vue实现双向绑定原理(vue实现双向数据绑定)
- dedecms更新后设置不显示(dedecms中tags页面显示错位的解决方法)
- dedecms怎么设置下拉菜单(织梦DedeCMS实现 三级栏目_二级栏目_一级栏目_网站名称 的效果代码)
- dede标签使用(解决{dede:arclist keyword='动态获取关键词'})
- laravelblade界面(laravel5.1框架基础之Blade模板继承简单使用方法分析)
- 延迟加载js文件
- php 创建定时任务(PHP扩展Swoole实现实时异步任务队列示例)
- jquery 淡入淡出
- python 百度搜索结果(Python模拟百度自动输入搜索功能的实例)