Tag: 锁死

如何解决SQL Server错误1222即解锁一个SQL Server表

我正在一个数据库中,我通过数据加载器加载一个原始表中的数据。 但是今天的数据加载程序由于未知的原因卡住了。 然后我停止从Windows任务pipe理器的数据加载器。 但是,我再次尝试加载原始表中的数据,但发现它被locking,我不能做任何操作。 我试过重新启动SQL Server服务,但没有解决。 而且我没有权限在这台服务器上终止进程。 以下是SQL Server显示的消息。 执行Transact-SQL语句或批处理时发生exception。 (Microsoft.SqlServer.ConnectionInfo) 计划地点: 在Microsoft.SqlServer.Management.Common.ServerConnection.ExecuteNonQuery(String sqlCommand,ExecutionTypes executionType) 在Microsoft.SqlServer.Management.Common.ServerConnection.ExecuteNonQuery(StringCollection sqlCommands,ExecutionTypes executionType) 在Microsoft.SqlServer.Management.Smo.ExecutionManager.ExecuteNonQuery(StringCollection查询) 在Microsoft.SqlServer.Management.Smo.SqlSmoObject.ExecuteNonQuery(StringCollection查询,布尔includeDbContext) 在Microsoft.SqlServer.Management.Smo.NamedSmoObject.RenameImplWorker(String newName) 在Microsoft.SqlServer.Management.Smo.NamedSmoObject.RenameImpl(String newName) =================================== 超过locking请求超时时间。 参数@objname不明确,或者声明的@objtype(OBJECT)错误。 (.Net SqlClient数据提供程序) 服务器名称:162.44.25.59错误号:1222 严重性:16状态:56 过程:sp_rename行号:282 我的SQL Server版本是2008 R2。

为什么不locking相同的对象导致死锁?

可能重复: C#中的重入锁 如果我写这样的代码: class Program { static void Main(string[] args) { Foo(); Console.ReadLine(); } static void Foo() { lock(_lock) { Console.WriteLine("Foo"); Bar(); } } static void Bar() { lock(_lock) { Console.WriteLine("Bar"); } } private static readonly object _lock = new object(); } 我得到输出: Foo Bar 我预料到这会陷入僵局,因为Foo获得一个锁,然后等待Bar获得锁。 但是这不会发生。 locking机制是否只是允许这个,因为代码是在同一个线程上执行的?

recursion锁(Mutex)与非recursion锁(Mutex)

POSIX允许互斥体recursion。 这意味着相同的线程可以locking相同的互斥锁两次,不会死锁。 当然它也需要解锁两次,否则没有其他线程可以获得互斥量。 并不是所有支持pthread的系统都支持recursion互斥,但是如果他们想要符合POSIX,他们必须这样做 。 其他API(更高级别的API)通常也提供互斥锁,通常称为Locks。 一些系统/语言(例如Cocoa Objective-C)提供recursion和非recursion互斥。 一些语言也只提供一个或另一个。 例如在Java互斥体总是recursion的(同一个线程可能会在同一个对象上两次“同步”)。 根据他们提供的其他线程function,没有recursion互斥可能没有问题,因为他们可以很容易地自己写(我已经在更简单的互斥/条件操作的基础上自己实现recursion互斥)。 我真的不明白:什么是非recursion互斥体? 为什么我想要一个线程死锁,如果它locking相同的互斥锁两次? 即使是能够避免这种情况的高级语言(例如,如果这样做会死锁并抛出一个exception,通常也不会这样做)。 他们会让线程死锁。 这是唯一的情况下,我不小心locking了两次,只有一次解锁,并在recursion互斥的情况下,这将是很难find问题,所以相反,我立即死锁,看看哪里出现不正确的锁? 但是我不能在解锁时返回一个locking计数器,在这种情况下,我确信我释放了最后一个锁,而计数器不是零,我可以抛出exception或logging问题? 还是有没有其他更有用的非recursion互斥体的使用情况,我没有看到? 或者也许只是performance,因为非recursion互斥可以比recursion互斥略快一点? 但是,我testing了这个,差别并不大。

C#中的重入锁

下面的代码会导致在.NET上使用C#发生死锁吗? class MyClass { private object lockObj = new object(); public void Foo() { lock(lockObj) { Bar(); } } public void Bar() { lock(lockObj) { // Do something } } }