WCF开发工具为我们带来了非常大的好处。它的强大的功能优势令其在开发领域中占据着非常重要的地位。在这里我们将会为大家详细介绍一下有关WCF程序事务的相关定义与实现方法,希望能对大家有所帮助。
WCF程序事务定义如下:
[ServiceContract(SessionModeSessionMode = SessionMode.Required)]
public interface IComplexService
{
[OperationContract]
[TransactionFlow(TransactionFlowOption.Mandatory)]
void ExecuteNoneQuery1(string sql);
[OperationContract]
[TransactionFlow(TransactionFlowOption.Mandatory)]
void ExecuteNoneQuery2(string sql);
[OperationContract]
[TransactionFlow(TransactionFlowOption.Mandatory)]
void ExecuteNoneQuery3(string sql);
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
WCF程序事务实现如下:
[ServiceBehavior(TransactionTimeout = "00:00:45",
TransactionIsolationLevel = System.Transactions.IsolationLevel.
Serializable)]
public class ComplexServiceImplement : IComplexService
{
private static void ExecuteNoneQuery(string sql)
{
string sqlConnectionString = "Password=sa;User
ID=sa;Initial Catalog=ipedf;Data Source=.";
string oraConnectionString = "User ID=sample;
Password=sample;Data Source=insapp";
using (OracleConnection oraConnection = new OracleConnection
(oraConnectionString))
{
try
{
oraConnection.Open();
OracleCommand cmd = oraConnection.CreateCommand();
cmd.CommandText = sql;
cmd.CommandType = CommandType.Text;
cmd.ExecuteNonQuery();
}
catch (Exception e)
{
string Debug = e.Message;
}
finally
{
oraConnection.Close();
}
}
using (SqlConnection sqlConnection =
new SqlConnection(sqlConnectionString))
{
try
{
sqlConnection.Open();
SqlCommand cmd = sqlConnection.CreateCommand();
cmd.CommandText = sql;
cmd.CommandType = CommandType.Text;
cmd.ExecuteNonQuery();
}
catch (Exception e)
{
string Debug = e.Message;
}
finally
{
sqlConnection.Close();
}
}
}
[OperationBehavior(
TransactionScopeRequired = true, TransactionAutoComplete = true)]
public void ExecuteNoneQuery1(string sql)
{
ExecuteNoneQuery(sql);
//OperationContext.Current.SetTransactionComplete();
}
[OperationBehavior(
TransactionScopeRequired = true, TransactionAutoComplete = true)]
public void ExecuteNoneQuery2(string sql)
{
ExecuteNoneQuery(sql);
//OperationContext.Current.SetTransactionComplete();
}
[OperationBehavior(
TransactionScopeRequired = true, TransactionAutoComplete = true)]
public void ExecuteNoneQuery3(string sql)
{
ExecuteNoneQuery(sql);
//OperationContext.Current.SetTransactionComplete();
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
- 41.
- 42.
- 43.
- 44.
- 45.
- 46.
- 47.
- 48.
- 49.
- 50.
- 51.
- 52.
- 53.
- 54.
- 55.
- 56.
- 57.
- 58.
- 59.
- 60.
- 61.
- 62.
- 63.
- 64.
- 65.
- 66.
- 67.
- 68.
- 69.
- 70.
- 71.
- 72.
- 73.
服务端配置如下:
< system.serviceModel>
< !--提供的服务-->
< services>
< service name="Wf.Complex.Service.ComplexServiceImplement"
behaviorConfiguration="myServiceBehavior">
< endpoint address="" binding="wsHttpBinding" bindingConfiguration=
"transactionalWsatHttpBinding" contract=
"Wf.Complex.Service.IComplexService"/>
< endpoint address="mex" binding="mexHttpBinding"
contract="IMetadataExchange"/>
< /service>
< /services>
< behaviors>
< serviceBehaviors>
< behavior name="myServiceBehavior">
< serviceMetadata httpGetEnabled="True"/>
< serviceDebug includeExceptionDetailInFaults="False"/>
< /behavior>
< /serviceBehaviors>
< /behaviors>
< bindings>
< wsHttpBinding>
< binding name="transactionalWsatHttpBinding" transactionFlow="true"/>
< /wsHttpBinding>
< /bindings>
< /system.serviceModel>
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
客户端代码如下:
IComplexService complex = new ComplexServiceClient();
try
{
using (TransactionScope scope = new TransactionScope
(TransactionScopeOption.Required))
{
string sql = "delete from student";
complex.ExecuteNoneQuery1(sql);
sql = "insert into student(id,name) values(1,'yeyang_1')";
complex.ExecuteNoneQuery2(sql);
sql = "insert into student(id,name) values(2,'yeyang_2')";
complex.ExecuteNoneQuery3(sql);
scope.Complete();
}
Console.WriteLine("succeed");
}
catch (Exception expt)
{
Console.WriteLine(expt.Message);
}
finally
{
(complex as ComplexServiceClient).Close();
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
运行结果:#t#
服务端的ExecuteNoneQuery方法中using (OracleConnection oraConnection = new OracleConnection(oraConnectionString))代码块发生异常,异常内容如下:
"无法加载 DLL“oramts.dll”: 找不到指定的模块。 (异常来自 HRESULT:0x8007007E)。"
结论:
对于数据库事务,可以通过WCF程序事务变形的方式来实现,但必须获取对应数据库产品的支持,sqlserver产品默认支持,oracle数据库产品需要考虑本风险,及时规避.