1,在T-SQL语句中用begin tran,end tran的方式

begin tran
--select top(1) * from dbo.test with(updlock)
update test with(updlock)
set name ='name_upd'
where id = 1
commit tran

2,利用ADO.NET的SqlTransaction类

     1)SqlConnection.ClientConnectionId可以查看出两个连接是否是连接池的同一个连接。
     2)一个SqlTransaction只能对应同一个SqlConnection,并且该SqlConnection不能关闭,否则SqlTransaction失效抛出异常。 从这个角度看,如果我们New SqlConnection() 两个链接,而ClientConnectionId相同,一定会是连接池先关闭了第一个SqlConnection,再把连接分配给了第二个SqlConnection,第一个SqlConnection如果有关联的SqlTransaction也会由于第一个SqlConnection的关闭而无效。总之,不要试图用一个SqlTransaction在多个SqlConnection间实现事务,这是行不通的。

3,利用.NET2.0提供的TransactionScope类

TransactionScope类可以实现分布式事务,不用在DB处理层处理事务,代码灵活也更加简洁,推荐使用。
msdn的一个例子:
// This function takes arguments for 2 connection strings and commands to create a transaction
// involving two SQL Servers. It returns a value > 0 if the transaction is committed, 0 if the
// transaction is rolled back. To test this code, you can connect to two different databases
// on the same server by altering the connection string, or to another 3rd party RDBMS by
// altering the code in the connection2 code block.
static public int CreateTransactionScope(
string connectString1, string connectString2,
string commandText1, string commandText2)
{
// Initialize the return value to zero and create a StringWriter to display results.
int returnValue = ;
System.IO.StringWriter writer = new System.IO.StringWriter(); try
{
// Create the TransactionScope to execute the commands, guaranteeing
// that both commands can commit or roll back as a single unit of work.
using (TransactionScope scope = new TransactionScope())
{
using (SqlConnection connection1 = new SqlConnection(connectString1))
{
// Opening the connection automatically enlists it in the
// TransactionScope as a lightweight transaction.
connection1.Open(); // Create the SqlCommand object and execute the first command.
SqlCommand command1 = new SqlCommand(commandText1, connection1);
returnValue = command1.ExecuteNonQuery();
writer.WriteLine("Rows to be affected by command1: {0}", returnValue); // If you get here, this means that command1 succeeded. By nesting
// the using block for connection2 inside that of connection1, you
// conserve server and network resources as connection2 is opened
// only when there is a chance that the transaction can commit.
using (SqlConnection connection2 = new SqlConnection(connectString2))
{
// The transaction is escalated to a full distributed
// transaction when connection2 is opened.
connection2.Open(); // Execute the second command in the second database.
returnValue = ;
SqlCommand command2 = new SqlCommand(commandText2, connection2);
returnValue = command2.ExecuteNonQuery();
writer.WriteLine("Rows to be affected by command2: {0}", returnValue);
}
} // The Complete method commits the transaction. If an exception has been thrown,
// Complete is not called and the transaction is rolled back.
scope.Complete(); } }
catch (TransactionAbortedException ex)
{
writer.WriteLine("TransactionAbortedException Message: {0}", ex.Message);
}
catch (ApplicationException ex)
{
writer.WriteLine("ApplicationException Message: {0}", ex.Message);
} // Display messages.
Console.WriteLine(writer.ToString()); return returnValue;
}

几篇关于TransactionScope的博客

https://blog.appliedis.com/2015/05/27/the-magic-of-transactionscope/

下面这些情况会被提升成MSDTC分布式事务

1)不同服务器的数据库

2)同一服务器,不同数据库(连接字符串不同)。

3)同一服务器,同一数据库(连接字符串相同)。但出现了嵌套调用的情况。

就是外层开了一个SqlConnection,还没有关闭,里面又New了一个SqlConnection,这时,.Net的连接池会开两个单独的连接,两个连接当然会     当成分布式的事务了。

要保证事务不被提升成分布式事务,有两种方式。

1)数据库字符串只能用同一个,事务内的所有操作,都共用同一个SqlConnection。

2)数据库字符串只能用同一个,事务内的所有操作,都必须串行的关闭自己开的连接。这种情况连接池会共用同一连接。

一般写了DBHelper的工程,都是满足这个条件的。

要在同一事务内,访问同一服务器的不同数据库。有两种方式:

①  在sql文中,显示指定数据库名: TestDB..Table1

② 利用SqlConnection的ChangeDatabase方法,更改成目标数据库名,然后执行SQL语句,记住用完切回原来的数据库。

4,如果是跨服务器部署数据库,那就要必须用分布式事务了,启用MSDTC的方法

http://blog.csdn.net/zy0421911/article/details/52225082

可以用DTCPing.exe软件测试两端是否正常连通

.NET实现事务的编码方式的更多相关文章

  1. spring事务的开启方式(编程式和声明式)

    1.编程式事务:编码方式实现事务管理(代码演示为JDBC事务管理) Spring实现编程式事务,依赖于2大类,分别是上篇文章提到的PlatformTransactionManager,与模版类Tran ...

  2. Spring事务管理实现方式之编程式事务与声明式事务详解(转)

    原文:https://blog.csdn.net/liaohaojian/article/details/70139151 编程式事务 编码方式实现事务管理(代码演示为JDBC事务管理) Spring ...

  3. Redis与KV存储(RocksDB)融合之编码方式

    Redis与KV存储(RocksDB)融合之编码方式 简介 Redis 是目前 NoSQL 领域的当红炸子鸡,它象一把瑞士军刀,小巧.锋利.实用,特别适合解决一些使用传统关系数据库难以解决的问题.Re ...

  4. Java不同编码方式,中英文字符所占字节数

    测试代码 public class Test { public static void main(String[] args){ String[] charsetNames={ "UTF-8 ...

  5. form表单编码方式设置为multipart/form-data,后台参数出现乱码情况

    一般在上传图片过程中,form中的编码方式一般采用multipart/form-data方式编码,但是后台这取参数时,可能会出现乱码情况:这里后台要采用转换编码方式: 页面: 后台:获取表单元素时,

  6. servlet获取表单数据的方式和编码方式

    .在servlet中获取表单的数据的几种方式  1>request.getParameter(“name”)://获取指定名称的值,返回值类型是一个字符串  2>request.getPa ...

  7. python 改变字符串的编码方式

    字符串str的编码方式为utf-8,转化为gbk,分为两步 1. str=str.decode('utf-8') 2. str=str.encode('gbk')

  8. [No000040]取得一个文本文件的编码方式

    using System; using System.IO; using System.Text; /// <summary> /// 用于取得一个文本文件的编码方式(Encoding). ...

  9. Java文件读写操作指定编码方式防乱码

    读文件:BufferedReader 从字符输入流中读取文本,缓冲各个字符,从而提供字符.数组和行的高效读取. 可以指定缓冲区的大小,或者可使用默认的大小.大多数情况下,默认值就足够大了. 通常,Re ...

随机推荐

  1. iOS 技术篇: 如何利用dsym文件分析苹果被拒日志

    今天提审被拒了.伤心

  2. 线程、对称多处理和微内核(OS 笔记三)

    线程.对称多处理 ​ 这一部分继续深入探讨与进程管理相关的高级概念并了解多处理机的对称多处理技术. 进程和线程 到目前为止提出的进程的概念包含两个特点: 资源所有权 存放进程映像的虚拟地址空间 调度/ ...

  3. 数码管应用digital_pile

    #include "reg52.h" #include "digital_pile.h" void main(){ //P0 = 0x00; //P2 = 0x ...

  4. no console to display at this time

    no console to display at this time我把控制台关掉,重新run as 还是同样问题,于是运行其他项目,但是其他项目能正常运行,说明项目写的有问题,而不是控制台的问题

  5. 以为是tomcat出现using问题,怎么改都改不好终于找到原因

    我也是醉了被自己打败了,以上问题困扰我半天是时间,百度好久都没有解决.应该打开tomcat的bin下的starup.bat结果打开了tomcat-src中的了,怪不得死活出现不了startup

  6. 以添加评论组件为例看angular2请求数据的处理

    在NiceFish项目中,数据请求处理并没有用Promise的那一套方法,用的是Observable(观察者模式),我将其理解成生产者和消费者模式 如下简单例子:出自(https://segmentf ...

  7. 3dmax多个版本软件的安装包以及安装教程

    这个文档具体出自哪里,我也是记不得了,需要的看下,链接如果是失效,那我也无能为力了. 免费分享,链接永久有效 2014版3D MAX链接:http://pan.baidu.com/s/1nuFr7Xv ...

  8. 喵哈哈村的魔法考试 Round #11 (Div.2) 题解

    喵哈哈村的星星与月亮(一) 打表发现答案就等于a*b%mod 注意a*b可能爆longlong #include<bits/stdc++.h> using namespace std; c ...

  9. java计算今天是今年的第几天

    Calendar.getInstance().get(Calendar.DAY_OF_YEAR)

  10. react-native组件封装与传值

    转载链接:http://www.ncloud.hk/%E6%8A%80%E6%9C%AF%E5%88%86%E4%BA%AB/react-native-component-packaging-and- ...