9 c# sql transactions sql-server-2005 sqlconnection
我SqlTransaction
在c#中实现了开始,提交和回滚事务.一切都很顺利,但是在访问交易期间连接的那些表时我遇到了一些问题.在交易期间我无法读取表格(那些在交易中的表格).在搜索这个时,我发现它是由于独占锁而发生的.依次对该数据的任何后续选择都必须等待释放独占锁.然后,我已经完成了所提供的每个隔离级别SqlTransaction
,但它没有用.因此,我需要在事务期间释放独占锁,以便其他用户可以访问该表并可以读取数据.有没有办法实现这个目标?提前致谢.
这是我的交易的c#代码
try
{
SqlTransaction transaction = null;
using (SqlConnection connection=new SqlConnection(Connection.ConnectionString))
{
connection.Open();
transaction=connection.BeginTransaction(IsolationLevel.Snapshot,"FaresheetTransaction");
//Here all transaction occurs
if (transaction.Connection != null)
{
transaction.Commit();
transaction.Dispose();
}
}
}
catch (Exception ex)
{
if (transaction.Connection != null)
transaction.Rollback();
transaction.Dispose();
} `
Run Code Online (Sandbox Code Playgroud)
这段代码工作正常,但问题是当我在事务处理期间访问表的数据(在事务期间访问的那些)时.这些表正由应用程序的其他部分访问.因此,当我尝试从表中读取数据时,它会抛出异常.
Mar*_*ell 15
根据设计,SQL事务是ACID.特别是,"I"在这里伤害了你 - 这是为了防止其他连接看到不一致的中间状态.
单个读取连接可以通过使用NOLOCK
提示或READ UNCOMMITTED
隔离级别来选择忽略此规则,但听起来您想要的是写入连接不带锁.好吧,那不会发生.
但是,对于读者来说,使用快照隔离可能会有所帮助,这可以在没有读取器锁定的情况下实现隔离(通过查看,如名称所示,在事务启动时查看一致状态的时间点).
但是,IMO你最好建议你看看:
第一个更简单.
一个简单的事实是:如果你采取一个长期运行的事务,操作大量数据,是的,你将导致问题.这就是你不这样做的原因.系统运行正常.
归档时间: |
|
查看次数: |
19017 次 |
最近记录: |