相关疑难解决方法(0)

TransactionScope和Transactions

在我的C#代码中,我使用TransactionScope,因为我被告知不要依赖我的sql程序员将始终使用事务,我们负责和yada yada.

话说回来

它看起来像TransactionScope对象在SqlTransaction之前回滚?这是可能的,如果是这样,在事务中包装TransactionScope的正确方法是什么.

这是sql测试

CREATE PROC ThrowError
AS

BEGIN TRANSACTION --SqlTransaction
SELECT 1/0

IF @@ERROR<> 0
BEGIN
  ROLLBACK TRANSACTION --SqlTransaction
  RETURN -1 
END
ELSE
BEGIN
  COMMIT TRANSACTION --SqlTransaction
  RETURN 0
END

go

DECLARE @RESULT INT

EXEC @RESULT = ThrowError

SELECT @RESULT
Run Code Online (Sandbox Code Playgroud)

如果我运行这个,我得到除以0并返回-1

从C#代码调用我得到一个额外的错误消息

遇到零除错误.
EXECUTE之后的事务计数表示缺少COMMIT或ROLLBACK TRANSACTION tatement.先前的计数= 1,当前计数= 0.

如果我给sql事务一个名字然后

无法回滚SqlTransaction.未找到该名称的任何事务或保存点.EXECUTE之后的事务计数表示缺少COMMIT或ROLLBACK TRANSACTION语句.先前的计数= 1,当前计数= 2.

有时似乎计数上升,直到应用程序完全退出

c#就是这样

        using (TransactionScope scope = new TransactionScope())
        {
             ... Execute Sql 

             scope.Commit()
         }
Run Code Online (Sandbox Code Playgroud)

编辑:

sql代码必须适用于2000和2005

c# sql transactions

17
推荐指数
2
解决办法
2万
查看次数

System.Transactions的实际用途是什么?

我见过System.Transactions命名空间,并且想知道,我是否可以使用此命名空间使用实际生成RDMBS?

但是当我看到一些例子时,我不明白System.Transactions如何做除了简单的try catch以及获得成功/失败结果之外的任何事情?

这是MSDN网站上的示例,我知道它可能非常简单,但我无法理解此示例中的好处,有人可以告诉我以下示例中的简单try/catch和Transaction范围之间有什么区别.

如果我应该创建一个RDBMS(创建我自己的RDMBS),我知道我们必须将大量日志写入我们执行的操作的磁盘,最后我们在回滚的情况下撤消这些操作,但这里什么也没有关于撤消任何事情.

// 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 …
Run Code Online (Sandbox Code Playgroud)

.net transactions transactionscope system.transactions

7
推荐指数
1
解决办法
4198
查看次数

从BLL中的一个方法跨多个DAL方法进行的事务

您将如何从业务逻辑层中的一个方法调用数据访问层中的多个方法,以便所有SQL命令都存在于一个SQL事务中?

可以从BLL中的其他位置单独调用每个DAL方法,因此无法保证数据层方法始终是事务的一部分.我们需要这个功能,所以如果数据库在长时间运行的过程中脱机,就没有提交.业务层基于每个先前调用的结果来编排不同的数据层方法调用.我们只想在整个过程的最后提交(从业务层).

.net c# sql

6
推荐指数
1
解决办法
3219
查看次数

如何加入 TransactionScope?

简洁版本

我如何加入正在进行的TransactionScope

长版

如果您使用TransactionScope,您可以创建一个“环境”事务:

using (TransactionScope scope = new TransactionScope())
{
   //...stuff happens, then you complete...

   // The Complete method commits the transaction. 
   scope.Complete();
}
Run Code Online (Sandbox Code Playgroud)

那有什么用呢?好吧,.NET 框架中有一些类知道如何通过检查以下内容来检查是否存在环境正在进行的事务static

这让他们知道有一项交易正在进行中。

例如,如果您有一些不考虑事务的任意数据库操作:

void DropStudents()
{
   using (var cmd = connection.CreateCommand())
   {
      cmd.CommandText = "DROP TABLE Students;";
      cmd.ExecuteNonQuery();
   }
}
Run Code Online (Sandbox Code Playgroud)

如果你把它放在TransactionScope的中间:

using (TransactionScope scope = new TransactionScope())
{
   DropStudents();

   // The Complete method commits the transaction. 
   scope.Complete();
}
Run Code Online (Sandbox Code Playgroud)

突然间,您的 ADO.net 操作处于事务中;并且可以回滚。

自动开始事务、提交和回滚

SqlClient库知道要检查: …

.net transactionscope

6
推荐指数
1
解决办法
854
查看次数

在实施IEnlistmentNotification时我应该在哪里执行操作?

我试图通过实现IEnlistmentNotification接口创建自定义"资源管理器" .该接口有以下方法:

  • 准备()
  • 承诺()
  • 回滚()
  • 怀疑()

虽然很清楚回滚代码应该在Rollback()方法中,但我不确定在哪种方法中应该实现执行实际操作的代码?它应该在Prepare()或Commit()中,还是在类中的一些其他自定义方法中,这些方法将从TransactionScope块内部的外部代码中调用?

.net c# transactions transactionscope

5
推荐指数
1
解决办法
2648
查看次数

环境事务中的TransactionScope错误不会回滚事务

我使用这样的环境事务:


using(TransactionScope tran = new TransactionScope()) {
    CallAMethod1();//INSERT
    CallAMethod2();//INSERT
    tran.Complete();
}
Run Code Online (Sandbox Code Playgroud)

该方法CallAMethod2();返回affected rows =-264 所以它无法插入但是第一个Insert已经提交了!

我想知道如何使用ambient transaction以及如果第二种方法有多个需要内部事务的操作,如果我将这些操作放在内部事务中该怎么办?像这样 :

     DAL_Helper.Begin_Transaction();

              //------Fill newKeysDictioanry

                affectedRow = DBUtilities.InsertEntityWithTrans("table2", newKeysDictioanry, DAL_Helper);

                if (affectedRow == 1)
                {
                    if (!string.IsNullOrEmpty(sp_confirm))
                    {
                        result_dt = UserTransactionDAL.Run_PostConfirm_SP(sp_PostConfirm, OBJ.ValuesKey, DAL_Helper);
                        if (result_dt.Rows.Count > 0 && result_dt.Rows[0][0].ToString() == "0")
                        {
                            DAL_Helper.current_trans.Commit();

                            if (DAL_Helper.connectionState == ConnectionState.Open)
                            {
                                DAL_Helper.Close_Connection();
                            }
                            return 1;// affectedRow;
                        }
                        else
                        {
                            DAL_Helper.current_trans.Rollback();
                            if (DAL_Helper.connectionState == ConnectionState.Open)
                            {
                                DAL_Helper.Close_Connection();
                            }
                            return -2; 
                        }
                    }
//etc
Run Code Online (Sandbox Code Playgroud)

c# asp.net informix transactions transactionscope

1
推荐指数
1
解决办法
5695
查看次数