标签: database-deadlocks

SQL死锁问题

在这两个语句的关系数据库中是否可能出现死锁?我正在尝试简化我的问题和示例 - 请假设这些选择,我认为通常只需要可共享的读锁定,现在需要独占的读锁:

Concurrent Connection 1:
SELECT {...}
FROM A 
JOIN B ON {...}

Concurrent Connection 2:
SELECT {...}
FROM B 
JOIN A ON {...}
Run Code Online (Sandbox Code Playgroud)

也就是说,连接的顺序是否重要?SQL中的单个语句是原子的吗?首先锁定A然后在第一个语句中B和B先锁定然后在第二个语句中锁定A?

我想不是 - 我的直觉告诉我,这样的两个单一陈述不会陷入僵局,无论多么复杂.我相信一个声明作为一个整体被分析,并且需要锁定的资源使用一些确定性的全局顺序(即按字母顺序)被锁定.但我需要的不仅仅是一种直觉 - 我无法想出一种证明它的方法,而且我无法找到它.

我对MS SQL 2005很感兴趣,但我不认为这个问题是特定于实现的.

其次:由于它与MS SQL有关,我还想知道Common Table Expressions也有这种保证--CTE主要是语法上的好处(+递归),并由引擎整合到传统的单个语句中.

sql sql-server-2005 database-deadlocks

4
推荐指数
1
解决办法
951
查看次数

如何从MS SQL 2008中的数据库ID,文件ID,页面ID获取表名?

我有死锁图,其中这三个字段的DB ID,文件ID,页面ID提到了锁定的资源.还有一些相关的目标.我想知道的是这个页面属于哪个表.我试过DBCC PAGE(dbid, fileid, pageid) with tableresults但是没有显示任何表名.

知道如何获得这个吗?

更新:还试过SELECT name From sys.indexes WHERE object_id = 123 and Index_id = 456 这里123是m_objid(下一个ObjectId),456是m_indexid(下一个IndexId)我得到的DBCC Page命令输出.我得到的只是NULL.

database sql-server dbcc database-deadlocks

4
推荐指数
1
解决办法
2万
查看次数

查询是锁定表,无法杀死该进程

我在MySQL中有一个查询锁定表(使用InnoDB):

UPDATE table SET status = 2 WHERE status = 3
Run Code Online (Sandbox Code Playgroud)

此查询导致表上出现死锁,无法绕过它.

我试着这样做:

show processlist
Run Code Online (Sandbox Code Playgroud)

然后杀死进程ID但我似乎无法杀死它

我试过了:

kill 9588
Run Code Online (Sandbox Code Playgroud)

9588是进程ID.

然后,show processlist我仍然在列表上看到相同的查询.

如何强制终止此进程,然后为什么此查询会导致死锁?我该怎么解决?

mysql deadlock kill-process database-deadlocks

4
推荐指数
3
解决办法
3万
查看次数

使用 READ_COMMITTED_SNAPSHOT 和 EF 代码前 5

最近,我们的用户有时会遇到timeout expire 错误,当他们想要更新 DB 上的某些记录时。(我认为 DB 中发生了死锁之类的事情)我们的数据库是SQL Server 2008 R2,我们的应用程序首先由 EF5 代码开发。

今天我读了一篇关于READ_COMMITTED_SNAPSHOT在 SQL Server 中使用选项的文章,我认为这个选项可以帮助我们防止数据库中的死锁。根据那篇文章,它有两个步骤:

1-READ_COMMITTED_SNAPSHOT在数据库中激活

ALTER DATABASE testDatabase SET ALLOW_SNAPSHOT_ISOLATION ON;
ALTER DATABASE testDatabase SET READ_COMMITTED_SNAPSHOT ON;
Run Code Online (Sandbox Code Playgroud)

2-READ_COMMITTED_SNAPSHOT在代码中使用选项:

using (var transactionScope =
new TransactionScope(TransactionScopeOption.Required,
new TransactionOptions { IsolationLevel= IsolationLevel.Snapshot }))
{
  // update some tables using entity framework  
  context.SaveChanges();  
  transactionScope.Complete();
}
Run Code Online (Sandbox Code Playgroud)

这个示例,使用了TransactionScop语句。但我们没有TransactionScop用于管理Transactions. 例如,我们的模型中有继承,当我们调用时.SaveChange()EF创建和管理Transaction它自己。

READ_COMMITTED_SNAPSHOT没有不用 …

c# entity-framework transactions sql-server-2008 database-deadlocks

4
推荐指数
1
解决办法
5795
查看次数

使用 PreparedStatements 时 SQL Server 死锁

我有一个 java servlet 应用程序,我正在使用准备好的查询来更新 SQL Server 数据库表中的记录。

假设我想执行UPDATE MyTable SET name = 'test' WHERE id = '10'. (是的,id 是一个 varchar)
我使用以下代码来实现这一点:

PreparedStatement pstmt = con.prepareStatement("UPDATE MyTable SET name = ? WHERE id = ?");
pstmt.setString(1, getName() );
pstmt.setString(2, getID() );
pstmt.executeUpdate();
Run Code Online (Sandbox Code Playgroud)

我发现当我运行一个 JMeter 脚本来模拟 2 个用户时,这个语句会导致我的数据库出现死锁。

我想检查我在 SQL Profiler 中的值,所以我使用了以下代码,以便我可以检查这些值。

String query = String.format("UPDATE MyTable SET name = '%s' WHERE id = '%s' ", getName(), getID() );
PreparedStatement pstmt = con.prepareStatement(query);
pstmt.executeUpdate();
Run Code Online (Sandbox Code Playgroud)

突然间,我的僵局消失了!遗憾的是,最后一种方法容易受到 SQL 注入的影响。

有没有人可以告诉我发生了什么和/或如何解决它?

java sql-server concurrency prepared-statement database-deadlocks

4
推荐指数
1
解决办法
2250
查看次数

更新存储过程中的死锁

我正在处理数据输入面板,一次有 300 多个客户端在更新数据表上的数据,我正在使用存储过程在数据表中执行更新,如下所示..

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:                <Author,,Name>
-- Create date: <Create Date,,>
-- Description:        <Description,,>
-- =============================================
ALTER PROCEDURE [dbo].[Update_Tbl_Client_Bpo_Data]

@Id int,
@CId varchar(50),
@Tbc_No varchar(200),
@Name varchar(200),
@EmailId varchar(200),
@MobileNo varchar(50),
@Gender varchar(50),
@LicenseNo varchar(200),
@GirNo varchar(200),
@PanNo varchar(200),
@H_Address varchar(500),
@H_City varchar(200),
@H_PinNo varchar(200),
@H_county varchar(200),
@H_State varchar(200),
@O_Address varchar(200),
@O_City varchar(200),
@O_PinNo varchar(200),
@LAL varchar(200),
@MRNNo varchar(200),
@AF varchar(200),
@NRI varchar(200),
@CP varchar(200),
@Status varchar(200)

AS
BEGIN
        -- …
Run Code Online (Sandbox Code Playgroud)

c# sql sql-server stored-procedures database-deadlocks

4
推荐指数
1
解决办法
2017
查看次数

如何防止并发事务中数据库死锁?

场景:

事务A开始...

START TRANSACTION;
UPDATE table_name SET column_name=column_name+1 WHERE id = 1 LIMIT 1;
Run Code Online (Sandbox Code Playgroud)

与此同时,事务B开始......

START TRANSACTION;
UPDATE table_name SET column_name=column_name+1 WHERE id = 2 LIMIT 1;
UPDATE table_name SET column_name=column_name-1 WHERE id = 1 LIMIT 1;
COMMIT;
Run Code Online (Sandbox Code Playgroud)

现在,事务 B 正在等待行 1,该行被锁定在事务 A 中。

交易A继续进行……

UPDATE table_name SET column_name=column_name-1 WHERE id = 2 LIMIT 1;
COMMIT;
Run Code Online (Sandbox Code Playgroud)

现在我们遇到了死锁,因此两个事务都在等待对方解锁它们想要更新的行:'(

正如我在标题中所问的,我们如何防止 RDBMS 事务中的死锁?

我认为解决这种情况的唯一方法是我们回滚事务B并重新执行它。但是我们如何才能发现自己陷入了僵局,并立即摆脱困境,如何保证我们不会陷入死循环(例如,在非常繁重的 Web 应用程序上)。

如果有必要,我会使用 MySQL。但任何适用于其他 RDBMS 的解决方案都是受欢迎的 - 帮助其他从 Google 来到这里的人:)

sql transactions database-deadlocks

4
推荐指数
1
解决办法
8486
查看次数

查询以检查 postgres 中表的死锁状态

我想检查 Postgres 和 ORACLE 的系统表中是否清除了死锁。

请建议我如何检查死锁状态。

oracle postgresql deadlock database-deadlocks

4
推荐指数
1
解决办法
1万
查看次数

死锁与实体框架 - 如何重新运行交易?

这里遇到了一些困难的情况:我们的系统偶尔会出现死锁.而且我根本没有强大的数据库并发背景.

System.Data.SqlClient.SqlException: Transaction (Process ID 69) was deadlocked on
lock resources with another process and has been chosen as the deadlock victim.
Rerun the transaction.
Run Code Online (Sandbox Code Playgroud)

有几个应用程序访问数据库:使用Entity Framework访问数据库的主要MVC应用程序和几个简单的控制台应用程序,每个应用程序使用ADO.NET和原始SQL查询数据库,并通过BinaryTap ActiveRecord插入数据.

不幸的是,我是客户组织的FNG,所以我无法部署和测试新想法.此外,我们正在使用SSMS Express,因此我无法访问SQL事件探查器.但是我立即解决问题并不重要,更重要的是我记录了我对问题的分析.

当它说我应该重新运行事务时,错误消息是否有任何真相?这是我们的DaoBase - 我们每个HttpContext使用一个ObjectContext(通过Db属性).我们总是将我们的Dao更新(但不是查询)放在SafeAction中,以便它们包含在事务中.我试图正确地重新运行交易吗?

public abstract class DaoBase
{
    protected static CaseMateEntities Db
    {
        get
        {
            return ContextHelper<CaseMateEntities>.GetCurrentContext();
        }
    }


    protected static void SafeAction(Action<ObjectContext> action)
    {
        Exception exception = null;

        try {
            using (var scope = new TransactionScope()) {
                try {
                    if (Db.Connection.State != ConnectionState.Open)
                        Db.Connection.Open();

                    if (action != null)
                        action(Db); …
Run Code Online (Sandbox Code Playgroud)

entity-framework transactionscope database-deadlocks

3
推荐指数
1
解决办法
8842
查看次数

没有显式锁定的postgres死锁

我使用PostgreSQL 9.2,并且我没有在任何地方使用显式锁定,既不使用LOCK语句也不使用SELECT ... FOR UPDATE.但是,最近我得到了ERROR: 40P01: deadlock detected.检测到死锁的查询虽然包含在事务块中.无论如何,怎么回事?

postgresql transactions database-deadlocks

3
推荐指数
1
解决办法
3010
查看次数