3

更新为更直接的标题..

我在提交后立即从我的事务中查看提交的数据时遇到问题。

我接受来自用户输入的数据,以具有多个具有一对多关系的子表的父表的形式将数据放入数据库(SQL Server 2005)。我正在使用事务并在完成时提交它。数据已提交到数据库,但我SELECT在提交后立即对数据库运行了几个其他查询(仅限语句)以检查是否已输入组的所有行。任何人都可以随时输入这些行,并且每个行都在他们自己的事务中。因此,假设“组”在数据库中总共需要 3 行,我想提交我的事务,然后读取数据库以查看是否有任何组完成......包括我刚刚提交的事务。

问题是,显然在提交后读回数据并没有带回我刚刚提交的事务......如果这个事务是组中的最后一行,那么它会被读取遗漏并且不会返回。

所以...

  • 交易开始。
  • 写行...
  • 事务提交..
  • 阅读以查看是否存在完整的组...
  • 未返回当前事务的组。其他完整组返回。

需要注意的一点是,提交另一笔交易将导致返回此数据...如果此新交易包含完成另一组的行,我不会收到返回的新行...

这是我的代码..缩写...

SqlConnection sqlConn = getConn();  //getconn is a function that returns a connection object

String sqlSTR = "<<<MY INSERT STATEMENT>>>";
SqlTransaction trans = sqlConn.BeginTransaction(System.Data.IsolationLevel.ReadUncommitted,"Trans");
SqlCommand sqlCMD;
try
{
    sqlCMD = new SqlCommand(sqlSTR, sqlConn, trans);

    //...Add all my data to the DB.

    trans.Commit();
catch (SqlException sqlErr)
{
    trans.Rollback("Trans");
    throw;
}
finally
{
    trans.Dispose();
}

接下来是一些代码来读取数据库以查找“已完成的组”,但如果已完成,则不会返回此数据所属的组。

数据被存储......数据可以在下一次调用时通过相同的代码检索......但不是在这里。

就好像通过 SQL 提交事务需要时间,并且在 SQL Server 提交事务之前调用我的读取......即使我将事务设置为允许读取未提交的数据。

在继续执行其他代码之前,是否有某种方式让提交等待提交完成?

我尝试SELECT @@TRANCOUNT在提交后立即对连接进行操作,但它总是返回 0。

谢谢!

编辑:

public static SqlConnection getConn()
{
    try
    {
        string sqlStr = WebConfigurationManager.ConnectionStrings["conn_Main"].ConnectionString;

        SqlConnection sqlCN = new SqlConnection(sqlStr);
        sqlCN.Open();

        return sqlCN;
    }
    catch
    {
        throw;
    }
}

我正在使用存储过程读取事务后的记录...

在 SP 中,我使用了一个基本的 select 语句,它执行了几个连接,并且没有太多其他操作来首先拉回具有提交的“组”列表,然后每个组单独拉出各个组。第二部分似乎看不到随事务插入的记录......直到下一个事务被提交。

今天早上我正在做更多的测试,看看我是否能准确地知道提交事务后记录何时显示。

4

0 回答 0