分布数据库的事务处理-SQLServer

更新时间:2023-09-22 22:47:01 阅读量: 经管营销 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

分布式数据库事务处理

1. 为什么要用分布事务?

1) 为了保证数据库完整性,一致性。如大监管标准版中,业务库与基础信息库是分开的,

客户一般要求将最终结果反写到基础数据中。如果不引用分布事务,由于网络的原因及其他外界各方面的原因,会导至数据的不一致性。

2) 在对外项目中,我们时常会听到客户反应“为什么在流程中,前面是有的,到后面就是

不对了?(在操作后事件中,同步操作多表)”类似这样的问题,我方经常回复客户是“将此记录删除了,重新走一条”。

以上这种问题可以通过,开启事务的方法来避免,减少垃圾数据。下面以分布数据事务为例,讲解一下环境的配置及写法。

2.分布数据库数据的配置

数据库:2008 R2

1). 双方启动MSDTC服务

MSDTC服务提供分布式事务服务,如果要在数据库中使用分布式事务,必须在参与的双方服务器启动MSDTC(DistributedTransactionCoordinator)服务。如下图:

2. 打开双方135端口

MSDTC服务依赖于RPC(RemoteProcedureCall(RPC))服务,RPC使用135端口,保证RPC服务启动,如果服务器有防火墙,保证135端口不被防火墙挡住。

使用“telnetIP135”命令测试对方端口是否对外开放。也可用端口扫描软件(比如AdvancedPortScanner)扫描端口以判断端口是否开放。如果图:

图2)

图3)

图4)

图5)

图6)

图7)

然后一直下一步,直到见图8)

点击“完成”即可。

补充:首先允许Msdtc.exe 通过Window防火墙,如下图:

图9)

图10)

数据库按以下设置完成即可。

4.实例

1)在数据库中写相关的代码。

在启动事务的情况下,查B库的Test表。

在启动事务的情况下,对B库的Test表进行增、删、改。

注:在执行增、删、改时,确保XACT_ABORT是打开的。

2)在.net 代码中写分布事务

publicstring Server1Str =

System.Configuration.ConfigurationManager.ConnectionStrings[\].ToString();

publicstring

Server2Str

=

System.Configuration.ConfigurationManager.ConnectionStrings[\].ToString

();

TransactionOptionstOpt = newTransactionOptions();

tOpt.IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted; // 设置超时间隔为2分钟,默认为60秒 tOpt.Timeout = newTimeSpan(0, 2, 0);

using (TransactionScope scope =

newTransactionScope(TransactionScopeOption.RequiresNew, tOpt)) {

SqlConnection ser1conn = newSqlConnection(Server1Str); SqlConnection ser2conn = newSqlConnection(Server2Str); try

{

stringRowGuid = Guid.NewGuid().ToString();

// SqlConnection ser1conn = new SqlConnection(Server1Str); ser1conn.Open();

SqlCommand ser1cmd = newSqlCommand();

ser1cmd.Connection = ser1conn;

ser1cmd.CommandText = \values('eeeeee','\ + RowGuid + \; ser1cmd.ExecuteNonQuery();

ser2conn.Open();

SqlCommand ser2cmd = newSqlCommand();

ser2cmd.Connection = ser1conn;

ser2cmd.CommandText = \values('eeeeee','\ + RowGuid + \; ser2cmd.ExecuteNonQuery(); scope.Complete(); this.label2.Text = \;

} catch (Exception ex) {

this.label2.Text = ex.Message.ToString(); } finally

{ ser1conn.Close();

ser1conn.Dispose(); ser2conn.Close(); ser2conn.Dispose(); scope.Dispose(); }

}

本文来源:https://www.bwwdw.com/article/ldcd.html

Top