首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >表仅在使用nolock放入时有效

表仅在使用nolock放入时有效
EN

Stack Overflow用户
提问于 2018-06-29 20:56:32
回答 1查看 112关注 0票数 0

我的表只有在我使用nolock时才显示结果。

当我放入select * from mytable时,查询没有完成,并继续运行...

但是当我放入select * from mytable with (nolock)时,结果就会出现,查询也能正常运行。

有谁知道“为什么”或者从哪里开始搜索这个问题?

obs:数据库是新的,几天前创建的;是一个同源数据库,使用系统的用户少于10个(使用EF在asp.net mvc中创建)。

我有一个查询,当存在数据库锁定时,它通常会帮助我,但它没有显示任何内容:

代码语言:javascript
运行
复制
SELECT es.session_id AS session_id
,COALESCE(es.original_login_name, '') AS login_name
,COALESCE(es.host_name,'') AS hostname
,COALESCE(es.last_request_end_time,es.last_request_start_time) AS last_batch
,es.status
,COALESCE(er.blocking_session_id,0) AS blocked_by
,COALESCE(er.wait_type,'MISCELLANEOUS') AS waittype
,COALESCE(er.wait_time,0) AS waittime
,COALESCE(er.last_wait_type,'MISCELLANEOUS') AS lastwaittype
,COALESCE(er.wait_resource,'') AS waitresource
,coalesce(db_name(er.database_id),'No Info') as dbid
,COALESCE(er.command,'AWAITING COMMAND') AS cmd
,sql_text=st.text
,transaction_isolation =
    CASE es.transaction_isolation_level
    WHEN 0 THEN 'Unspecified'
    WHEN 1 THEN 'Read Uncommitted'
    WHEN 2 THEN 'Read Committed'
    WHEN 3 THEN 'Repeatable'
    WHEN 4 THEN 'Serializable'
    WHEN 5 THEN 'Snapshot'
END
,COALESCE(es.cpu_time,0) 
    + COALESCE(er.cpu_time,0) AS cpu
,COALESCE(es.reads,0) 
    + COALESCE(es.writes,0) 
    + COALESCE(er.reads,0) 
    + COALESCE(er.writes,0) AS physical_io
,COALESCE(er.open_transaction_count,-1) AS open_tran
,COALESCE(es.program_name,'') AS program_name
,es.login_time
FROM sys.dm_exec_sessions es
    LEFT OUTER JOIN sys.dm_exec_connections ec ON es.session_id = ec.session_id
    LEFT OUTER JOIN sys.dm_exec_requests er ON es.session_id = er.session_id
    LEFT OUTER JOIN sys.server_principals sp ON es.security_id = sp.sid
    LEFT OUTER JOIN sys.dm_os_tasks ota ON es.session_id = ota.session_id
    LEFT OUTER JOIN sys.dm_os_threads oth ON ota.worker_address = oth.worker_address
    CROSS APPLY sys.dm_exec_sql_text(er.sql_handle) AS st
where es.is_user_process = 1 
  and es.session_id <> @@spid
ORDER BY es.session_id
EN

回答 1

Stack Overflow用户

发布于 2018-06-29 21:49:30

简单的解释是,您需要使用NOLOCK来执行查询,这意味着至少有一个事务打开并在具有排它锁的特定表上运行。

NOLOCK提示执行脏读操作,并忽略表上的所有锁。

如果您没有获得该问题的日志,请尝试在单用户模式下获取数据库,这将断开其他用户的所有现有连接,然后在没有NOLOCK的情况下执行您的查询,然后检查它是否成功执行。如果是,则问题只是其他用户在该数据库上的某些事务处于活动状态。

此外,如果任何事务在您的会话中处于打开状态,则可以执行ROLLBACK TRANSCOMMIT TRANS来结束该事务。

READPAST提示可能是解决方案,但它不会解决您的根本问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51102304

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档