一、事务定义:
显式事务:明确指定事务的开始,connection需要打开方可使用,默认为closed,即:显示调用con.BeginTransaction()
隐式事务:无法明确指定事务的开始,默认connection已被打开为open
分布式隐式事务:使用TransactionScope类 , 【跨库且使用同一个事务提交】
分布式显式事务:使用CommittableTransaction类,con.EnlistTransaction(Transaction对象)//将连接登记到事务 【跨库且使用同一个事务提交】
//以下事例采用Linq to SQL 数据源
二、显示事务实例:
using (DataClasses1DataContext datacontext = new DataClasses1DataContext())
{ try { //必须打开连接,用于事务的创建 if (datacontext.Connection.State == ConnectionState.Closed) datacontext.Connection.Open(); //创建事务以及将创建的事务分配给该DataContext的Transaction datacontext.Transaction = datacontext.Connection.BeginTransaction(); var test_tran = datacontext.Products.Where(a => a.ProductID < 5).OrderBy(a => a.ProductID).Select(a => a); foreach (var test in test_tran) { test.ProductName = test.ProductName + "A"; } //datacontext.SubmitChanges(); //提交事务 //datacontext.Transaction.Commit(); } catch { //回滚事务 datacontext.Transaction.Rollback(); } }
三、隐式事务实例:
using (MyDataContext datacontext = new MyDataContext())
TransactionOptions option=new TransactionOptions();
option.IsolationLevel =System.Transactions.IsolationLevel.ReadCommitted;//隔离级别 option.Timeout = new TimeSpan(0, 2, 0);//事务超时时间 为2分钟 默认为60秒
using (TransactionScope scope = new TransactionScope()) {
try {
//在无事务环境中执行操作,即:取消环境事务(TransactionScopeOption.Suppress)
//每次进入创建新的事务环境(TransactionScopeOption.RequiresNew)
//每次进入将检测是否存在事务环境,若存在则使用,不存在则重新创建(TransactionScopeOption.Required)
var test_tran = datacontext.Products.Where(a => a.ProductID < 5).OrderBy(a => a.ProductID).Select(a => a);
foreach (var test in test_tran)
{
test.ProductName = test.ProductName + "A";
}
datacontext.SubmitChanges();
scope.Complete(); //代表完成事务,事务提交 }catch{//遇到异常自动回滚} 三、分布式隐式事务实例: 使用分布式事务必须开启服务:Distributed Transaction Coordinator 否则报错 “服务器 'MRWANG' 上的 MSDTC 不可用 ”
//分布在不同数据库之间的事务操作,如下事例:MyDataContext 和 OtherDataContext 两个不同数据库 即:分布式
using (MyDataContext datacontext1 = new MyDataContext())
using (TransactionScope scope1 = new TransactionScope()) { try{
var test = datacontext1.TestTable.Where(a => a.ID == 1); foreach (var test in test) { test.Name = test.Name + "B"; } datacontext1.SubmitChanges(); 注:
///////////--如下设置以后,嵌套事务(scope2)提交将和外层(scope1)TransactionScope无关--////////////
//1.在无事务环境中执行操作,取消环境事务(TransactionScopeOption.Suppress)
//2.每次进入创建新的事务环境(TransactionScopeOption.RequiresNew)
///////////////--scope2提交将和外层(scope1)TransactionScope有密切关联,scope2提交成功,外层遇到异常,则全部回滚,因为属于同一个事务环境--//////////////
//1.每次进入将检测是否存在事务环境,若存在则使用,不存在则重新创建(TransactionScopeOption.Required)
using (OtherDataContext datacontext2 = new OtherDataContext())
using (TransactionScope scope2=new TransactionScope(TransactionScopeOption.Required))
{
var test_tran = datacontext2.Products.Where(a => a.ProductID < 5).OrderBy(a => a.ProductID).Select(a => a); foreach (var test in test_tran) { test.ProductName = test.ProductName + "A"; } datacontext2.SubmitChanges();
scope2.Complete(); //只完成嵌套式的内部事务,但事务并未正式提交
}
scope1.Complete(); //代表完成所有事务,事务正式提交
}catch{//遇到异常自动回滚}
三、分布式显式事务实例: using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["MySqlServer"].ConnectionString)) { using (CommittableTransaction tran= new CommittableTransaction()) { conn.Open(); conn.EnlistTransaction(tran);//将连接登记到事务 using (SqlCommand cmd = new SqlCommand()) { cmd.Connection = conn; cmd.CommandType = CommandType.Text; try { cmd.CommandText = "insert into TranTable(Priority) values(1)"; cmd.ExecuteNonQuery(); cmd.CommandText = "insert into TranTable(Priority) values(256)"; cmd.ExecuteNonQuery(); tran.Commit();//提交事务 } catch (SqlException ex) { //回滚 tran.Rollback(); } } } conn.Close(); }
相关推荐
1. "双曲型方程-显式与隐式.docx" - 这可能是文档形式的理论介绍,详细阐述了显式和隐式方法的原理,以及它们在双曲型方程中的应用。 2. "Solve_and_Output.m" - 这可能是一个主程序,调用了其他函数来执行双曲型...
内容概述:SQL Server数据库相关内容,对应张磊著《SQL Server数据库应用技术项目化教程》中166页(3)ROLLBACK TRANSACTION将显式事务或隐式事务回滚到事务的结束所对应的源码。代码经个人运行后无误,如果下载后运行...
本文将深入探讨DLL的两种主要链接方式:显式链接和隐式链接。 **一、隐式链接** 隐式链接是Windows程序中最常见的链接DLL的方式。当编译器处理源代码时,它会查找所有引用的外部函数和变量,并将其与DLL中的符号...
首先,程序定义了四个双精度数组`x`, `y`, `y1`, `y2`,分别存储自变量值、显式方法解、隐式方法解以及真实值(由书中的例子给出)。数组的长度为20,足以容纳10个数据点(因为i从2开始,到11结束)。 在主函数中,...
本教程主要探讨显式Intent和隐式Intent以及Intent Filter的使用,旨在帮助开发者更好地理解和应用这些概念。 首先,让我们理解显式Intent。显式Intent是一种明确指定接收方的Intent。在创建显式Intent时,我们需要...
Intent分为四种主要类型:显式Intent、隐式Intent、系统Intent和使用`startActivityForResult`的Intent。下面将对这四个部分进行详细介绍。 ### 1. 显式Intent 显式Intent是最直接的Intent类型,它们明确地指定要...
神经网络模型在显式与隐式特征下的情感分类应用研究 本研究论文探讨了神经网络模型在显式与隐式特征下的情感分类应用。论文首先介绍了神经网络模型的基本概念和类型,然后详细讨论了 BLSTM、GRU 和 BGRU 三种神经...
在AndroidManifest.xml文件中,我们需要为每个可被隐式启动的Activity定义Intent Filter,比如: ```xml ``` 这段XML声明了TargetActivity能够响应`ACTION_VIEW`动作,并接受`http`和`https`协议的...
内容概述:SQL Server数据库相关内容,对应张磊著《SQL Server数据库应用技术项目化教程》中166页(2)COMMIT TRANSACTION标志一个成功的隐式事务或显式事务的结束所对应的源码。代码经个人运行后无误,如果下载后运行...
这个数据集包含了来自全球278858位独特的读者对271379本不同书籍的评分,涵盖了显式和隐式的反馈,使得分析更加全面深入。今天,我们将深入探讨这个数据集的重要性和它所蕴含的潜在价值。 首先,让我们理解数据集的...
主程序通过宏定义来选择是隐式还是显式调用DLL。宏定义可以在编译选项中设置,或者在源代码中通过`#ifdef`等预处理器指令来切换。 例如,如果定义了`USE_IMPLICIT`,则使用隐式调用;否则,使用显式调用。这样,只...
1. **隐式链接与显式链接** - **隐式链接**:在编译阶段,编译器会将DLL函数的调用直接插入到目标程序中。这需要在项目设置中指定所需的.lib导入库,并在链接时将.dll文件放在系统路径或应用程序目录下。这样,程序...
启动Activity有两种主要方式:显式启动和隐式启动,这两种方式各有特点,适用于不同的场景。 **显式启动(Explicit Intent)** 显式启动是最常见的启动Activity的方式,它明确指定了要启动的Activity类名。在创建...
针对现有的基于用户显式反馈信息的推荐系统推荐准确率不高的问题,提出了一种基于显式与隐式反馈信息的概率矩阵分解推荐方法。该方法综合考虑了显示反馈信息和隐式反馈信息,在对用户信任关系矩阵和商品评分矩阵进行...
利用MATLAB求解偏微分方程的有限差分法算例,可自行编写方程求解,只需更换方程即可。
### C#中的显式类型与隐式转换 在C#编程语言中,类型转换是非常重要的一个概念,它涉及数据类型的转换以及如何确保程序能够正确处理不同类型的数据。本文将基于提供的内容,详细介绍C#中几种常见的类型转换方法及其...
在分布式事务处理的设计中,开发者需要考虑到如何分配资源、管理并发、处理冲突以及可能出现的网络异常等问题。分布式事务处理的实现需要综合多种技术,包括但不限于数据库的事务日志、分布式事务协调器、网络通信...
SQL Server 分布式事务服务器的配置 SQL Server 分布式事务服务器的配置是一个复杂的过程,涉及到多个方面的设置和配置。以下是配置的详细步骤和知识点: 1. 启动 MSDTC 服务 MSDTC(Distributed Transaction ...
SMe:运动对象的显式和隐式约束空间概率阈值范围查询