none
学习事务的时候,偶然发现一个会话模式下的奇怪问题 RRS feed

  • 问题

  • 实例模式PreSeesion,开启了会话模式,在服务中设定了一个变量n,服务方法如下,

     
    [OperationBehavior(TransactionScopeRequired =true)]
            public void Update(string name,DateTime birthday)
            {
               
                string connstring = System.Configuration.ConfigurationManager.ConnectionStrings["sql"].ConnectionString;
              
                    try
                    {
                        using (var conn = new SqlConnection(connstring))
                        {
                            var comm = new SqlCommand();
                            comm.CommandText = "insert into Patient(Name,Birthday,T,tl) values(@name,@birthday,@t,@tl)";
                            comm.Parameters.Add("@name", SqlDbType.VarChar, 50).Value = name;
                            comm.Parameters.Add("@birthday", SqlDbType.DateTime).Value = birthday;
                        comm.Parameters.Add("@t", SqlDbType.VarChar, 50).Value = DBNull.Value;
                        comm.Parameters.Add("@tl", SqlDbType.VarChar, 255).Value = ++n;
                            comm.Connection = conn;
                            conn.Open();
                            comm.ExecuteNonQuery(); 
                        }
    
                    }
                    catch(Exception ex)
                    {
                        throw new FaultException(ex.Message);
                    }
            }

    客户端如下:

    using (var scope = new TransactionScope()) { service.Update("ccc", DateTime.Parse("1970-03-19")); service.Update("bbb", DateTime.Parse("1970-03-19")); scope.Complete(); }


    按照之前学习会话时候的经验,调用两次update,n变量应该是1和2。但我看数据库里,两条数据都是1。如果我不作为事务调用,则就符合会话模式的结果。这是什么问题?百思不解。

    2019年3月7日 7:07

答案

  • 你好,Dna_xp,
    WCF默认会把会话事务服务作为单调服务来处理,而不论你使用哪种实例事务模式,也就是

    InstanceContextMode =InstanceContextMode.PerCall


    这是一个设计缺陷,但也是为了强化状态感知的编程模型。
    为了在调用后不释放服务实例,在行为上模拟会话服务,我们可以设置

    [ServiceBehavior(ReleaseServiceInstanceOnTransactionComplete =false)]

    Regards

    Abraham

    2019年3月8日 5:57

全部回复

  • 发现
    TransactionScopeRequired =false,就是1,2
    2019年3月7日 12:26
  • 你好,Dna_xp,
    WCF默认会把会话事务服务作为单调服务来处理,而不论你使用哪种实例事务模式,也就是

    InstanceContextMode =InstanceContextMode.PerCall


    这是一个设计缺陷,但也是为了强化状态感知的编程模型。
    为了在调用后不释放服务实例,在行为上模拟会话服务,我们可以设置

    [ServiceBehavior(ReleaseServiceInstanceOnTransactionComplete =false)]

    Regards

    Abraham

    2019年3月8日 5:57