事务执行中,整个表都被锁住了吗?事务之外不能读了吗?

chenyuling 2016-12-28 03:01:03
c# sql208
代码如下,第一步执行一个事务
/// <summary>
/// 第一个事务
/// </summary>
/// <returns></returns>
public string Trans()
{
System.Data.SqlClient.SqlConnection cnn = new System.Data.SqlClient.SqlConnection(ConnStr);
System.Data.SqlClient.SqlCommand cm = new System.Data.SqlClient.SqlCommand();
cm.CommandTimeout = 1;
cm.Connection = cnn;
cnn.Open();
System.Data.SqlClient.SqlTransaction trans = cnn.BeginTransaction();
cm.Transaction = trans;
try
{
//修改ID为1的用户name为张三
cm.CommandText = "update users set name='张三' where id=1";
cm.ExecuteNonQuery();
//…其他业务逻辑需求,可能时间比较长…………………
trans.Commit();
}
catch(Exception e)
{
trans.Rollback();
//return ErrorJSON("网络繁忙,请稍候再试!");
}
finally
{
cnn.Close();
trans.Dispose();
cnn.Dispose();
}

return RightJSON();
}

在执行第一个事务的同时,直接在SQL Server Management Studio,运行如下语句,没有用到事务(网站有些地方没有用到事务直接读取)
SELECT * FROM users where id=2
为什么一定要等到前面一个事务执行完了之后才可以读取出来,我这个ID不是等于2吗?
如果是执行id=1搜索需要等待我可以理解。

如果是这样的话,岂不是整个项目在事务执行过程中,其他的人都只能是等待。项目岂不是变成了单线程了!!

如果解决这个问题,在一个事务执行中,可以修改其中的一条数据
同时可以对表的其他数据进行搜索读取
...全文
2898 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
shinger126 2017-02-17
  • 打赏
  • 举报
回复
如果确定查询的记录不在修改的记录中,可以这样查SELECT * FROM users with(nolock) where id=2
ceozenliu 2017-02-17
  • 打赏
  • 举报
回复
這種update,一般情況下,SQL SERVER會給出「頁鎖」,所以同一頁的數據,是不能select的,直到交易結束。 你可以修改update語句 update users with(rowlock) set name='张三' where id=1 --強制要求使用「行鎖」 或修改你的select SELECT * FROM users with(nolock) where id=2 --不掛鎖 註: SQLSERVER查詢優化器,會在性能與鎖的爭用中自動取得平衡,以決定鎖的策略。
Tiger_Zhao 2016-12-28
  • 打赏
  • 举报
回复
如果你的id是正真的主键,一般情况下第二个查询不需要等待(有主键的确如你所想可以判断出查询和锁定不是同一条记录)。
既然会等待,可能:
A)事务中对表的其它记录有更新,导致记录锁升级为表锁。
B)id不是主键,第二个查询就不能排除事务把锁定记录的id修改为2的可能。必须等待。

22,301

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧