C#分布式事务处理和SQL Server事务处理的问题

时间:2020-12-24 06:27:42
小弟遇到一些麻烦,关于事务处理的,C#中的分布式事务(TransactionScope类)用起来很简单、方便,直接在业务逻辑层套上一个TransactionScope就可以,但是需要配置MSDTC,这就给用户带来了不便,因为用户的计算机水平良莠不齐,自己可能不会配置。

但是用SqlTransaction 实现事务就比较麻烦了,因为目前的系统是低耦合的设计,数据访问层的方法都是单一功能的,一系列的、实现业务逻辑的操作都在业务逻辑层,用SqlTransaction 的话就破坏了分层。

我苦思冥想,是不是应该把业务逻辑性的方法都返回一个string型的SQL语句,装进一个List<string>中,然后再用SqlTransaction实现事务?这样就是稍微有些复杂,各位高手在事务处理上有什么好办法没?

16 个解决方案

#1


再问一下,用TransactionScope分布式事务必须得安装IIS 吗?

#2


只用过SqlTransaction,没用过你说的TransactionScope...爱莫能助

#3


#4



        public void ExeSql(string theSql)
        {
            using (SqlCommand theCommand2 = new SqlCommand())
            {
                theConn.Open();
                SqlTransaction trans = theConn.BeginTransaction(IsolationLevel.ReadCommitted);
                try
                {
                    theCommand2.Connection = theConn;
                    theCommand2.Transaction = trans;
                    theCommand2.CommandText = theSql;
                    theCommand2.ExecuteNonQuery();
                    trans.Commit();
                   
                }
                catch (Exception ex)
                {
                    trans.Rollback();
                    throw new ApplicationException(ex.Message); 
                }
                finally
                {
                    theConn.Close();
                }
            }
        }


这个事处理类,我一直是这么用,不知道跟你说的有什么区别

#5


#6


回4楼的:你这个方法就是我目前想到的唯一解决方案,不过有点麻烦,尤其是业务逻辑特别复杂的时候

#7


ding

#8


比如我要先查询,根据查询出来的结果再判断是否要添加、或修改其他表的数据等等复杂操作

#9


估计最终还是要用4楼的方法...

#10


vs2005以后不用安装iis

#11


引用 4 楼 ximi82878 的回复:
C# code
        public void ExeSql(string theSql SqlTransaction trans)
        {
            using (SqlCommand theCommand2 = new SqlCommand())
            {
                theConn.Open();
                theConn.Transaction = trans
                               try
                {
                    theCommand2.Connection = theConn;
                    theCommand2.T…


由外面创建一个事务.

#12



在能够使用事务的时候都应该使用事务,不要使用过度
执行的SQL语句通过泛型实现传递List<T>
也可使用sql server分布式事务解决

#13


要运行快就是Sql,想运行超慢就用C#

#14


结贴去了~

#15


22222222222222222222

#16


这太简单了,写存储过程!一下搞定

#1


再问一下,用TransactionScope分布式事务必须得安装IIS 吗?

#2


只用过SqlTransaction,没用过你说的TransactionScope...爱莫能助

#3


#4



        public void ExeSql(string theSql)
        {
            using (SqlCommand theCommand2 = new SqlCommand())
            {
                theConn.Open();
                SqlTransaction trans = theConn.BeginTransaction(IsolationLevel.ReadCommitted);
                try
                {
                    theCommand2.Connection = theConn;
                    theCommand2.Transaction = trans;
                    theCommand2.CommandText = theSql;
                    theCommand2.ExecuteNonQuery();
                    trans.Commit();
                   
                }
                catch (Exception ex)
                {
                    trans.Rollback();
                    throw new ApplicationException(ex.Message); 
                }
                finally
                {
                    theConn.Close();
                }
            }
        }


这个事处理类,我一直是这么用,不知道跟你说的有什么区别

#5


#6


回4楼的:你这个方法就是我目前想到的唯一解决方案,不过有点麻烦,尤其是业务逻辑特别复杂的时候

#7


ding

#8


比如我要先查询,根据查询出来的结果再判断是否要添加、或修改其他表的数据等等复杂操作

#9


估计最终还是要用4楼的方法...

#10


vs2005以后不用安装iis

#11


引用 4 楼 ximi82878 的回复:
C# code
        public void ExeSql(string theSql SqlTransaction trans)
        {
            using (SqlCommand theCommand2 = new SqlCommand())
            {
                theConn.Open();
                theConn.Transaction = trans
                               try
                {
                    theCommand2.Connection = theConn;
                    theCommand2.T…


由外面创建一个事务.

#12



在能够使用事务的时候都应该使用事务,不要使用过度
执行的SQL语句通过泛型实现传递List<T>
也可使用sql server分布式事务解决

#13


要运行快就是Sql,想运行超慢就用C#

#14


结贴去了~

#15


22222222222222222222

#16


这太简单了,写存储过程!一下搞定