更新为更直接的标题..
我在提交后立即从我的事务中查看提交的数据时遇到问题。
我接受来自用户输入的数据,以具有多个具有一对多关系的子表的父表的形式将数据放入数据库(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 语句,它执行了几个连接,并且没有太多其他操作来首先拉回具有提交的“组”列表,然后每个组单独拉出各个组。第二部分似乎看不到随事务插入的记录......直到下一个事务被提交。
今天早上我正在做更多的测试,看看我是否能准确地知道提交事务后记录何时显示。