在使用Spring(特别是Spring推荐的方法:声明式事务)时,在死锁或锁定超时异常时实现事务重启的最佳实践是什么?
谢谢,
阿萨夫
可能重复:
C#/ .NET分析工具,用于查找竞争条件/死锁
我正在调试一个应用程序,我怀疑它正在陷入僵局并挂起.但是,这只会每隔几天发生一次,并且它永远不会发生在我的计算机上,因此我无法将调试器挂钩.是否有任何实用程序或方法可以用来查询正在运行的应用程序,并找出哪些方法/锁定/它是什么死锁?
更新:通常,应用程序在客户位置运行,我无法访问该计算机,并且我不太愿意让他们安装大量软件.
我需要执行一个产生大量输出的命令,并且需要花费大量时间来执行(> 30分钟).我正在考虑使用subprocess.Popen来做到这一点.我需要捕获命令的输出,所以我将PIPE传递给stdout和stderr.
使用Popen.wait()时的死锁问题已在很多论坛上得到充分记录,因此Popen.communicate()是避免死锁的建议方法.该解决方案的问题是communication()阻塞直到命令完成.我需要在执行命令时打印到达stdout的所有内容.如果20分钟后没有输出,脚本执行将被终止.
以下是我需要遵守的一些约束:
有办法吗?
假设:
我有以下问题:
INSERT导致死锁?如果是这样,请提供一个详细的场景,演示如何发生死锁(例如,线程1执行此操作,线程2执行此操作,...,死锁).更新:3.对于超级奖励积分:如何在以下场景中避免死锁?
给定表格:
[id BIGINT PRIMARY KEY][id BIGINT PRIMARY KEY, name VARCHAR(30), permission_id BIGINT NOT NULL, FOREIGN KEY (permission_id) REFERENCES permissions(id))我按如下方式创建了一家新公司:
我删除公司如下:
在上面的示例中,INSERT锁定顺序是[permissions,companies],而DELETE锁定顺序是[companies,permissions].有没有办法解决这个例子REPEATABLE_READ或SERIALIZABLE隔离?
我有一个报告死锁的错误日志:
事务(进程ID 55)在锁定时死锁 与另一个进程通信缓冲资源并被选为死锁牺牲品.重新运行该交易.
我试图重现此错误,但我的标准死锁SQL代码产生一个不同的错误:
事务(进程ID 54)在锁资源上与另一个进程发生死锁,并被选为死锁牺牲品.重新运行该交易.
我想非常清楚,我不是在问什么是僵局.我完全理解基础知识.
我的问题是:lock | communication buffer resources在这种情况下的含义是什么?什么是"通信缓冲资源"?这lock |意味着什么吗?
我最好的猜测是当并行线程结合其结果时使用通信缓冲区.任何人都可以确认或否认这个吗?
我的最终目标是以某种方式触发第一个错误再次发生.
我正在使用MySQL 5.5.我注意到在并发场景中发生了一个特殊的死锁,我不认为应该发生这种死锁.
使用两个同时运行的mysql客户端会话重现:
mysql会话1:
create table parent (id int(11) primary key);
insert into parent values (1);
create table child (id int(11) primary key, parent_id int(11), foreign key (parent_id) references parent(id));
begin;
insert into child (id, parent_id) values (10, 1);
-- this will create shared lock on parent(1)
Run Code Online (Sandbox Code Playgroud)
mysql session 2:
begin;
-- try and get exclusive lock on parent row
select id from parent where id = 1 for update;
-- this will block because of shared lock …Run Code Online (Sandbox Code Playgroud) 谁能解释一下:
bowBack()以退出函数bow()- 或)?这是我得到的输出 - 然后程序卡住了!
阿方斯:加斯顿向我鞠躬致敬!
加斯顿:阿尔方斯向我鞠躬致敬!
public class Deadlock {
static class Friend {
private final String name;
public Friend(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
public synchronized void bow(Friend bower) {
System.out.format("%s: %s"
+ " has bowed to me!%n",
this.name, bower.getName());
bower.bowBack(this);
}
public synchronized void bowBack(Friend bower) {
System.out.format("%s: %s"
+ " has bowed back to me!%n",
this.name, bower.getName());
}
}
public static void …Run Code Online (Sandbox Code Playgroud) 我有一个类'数据库',作为ADO.net的包装器.例如,当我需要执行一个过程时,我调用Database.ExecuteProcedure(procedureName,parametersAndItsValues).
我们遇到了SQL Server 2000中死锁情况的严重问题.我们团队的一部分正在处理sql代码和事务以最小化这些事件,但我正在考虑使这个数据库类能够抵御死锁情况.
我们希望死锁受害者可能在经过一段时间的延迟后重试,但我不知道是否可能.这是我们使用的方法的代码:
public int ExecuteQuery(string query)
{
int rows = 0;
try
{
Command.Connection = Connection;
Command.CommandType = CommandType.Text;
if(DatabaseType != enumDatabaseType.ORACLE)
Command.CommandText = query;
else
Command.CommandText ="BEGIN " + query + " END;";
if (DatabaseType != enumDatabaseType.SQLCOMPACT)
Command.CommandTimeout = Connection.ConnectionTimeout;
if (Connection.State == ConnectionState.Closed)
Connection.Open();
rows = Command.ExecuteNonQuery();
}
catch (Exception exp)
{
//Could I add here any code to handle it?
throw new Exception(exp.Message);
}
finally
{
if (Command.Transaction == null)
{
Connection.Close();
_connection.Dispose();
_connection …Run Code Online (Sandbox Code Playgroud) 给出以下简单的Go程序
package main
import (
"fmt"
)
func total(ch chan int) {
res := 0
for iter := range ch {
res += iter
}
ch <- res
}
func main() {
ch := make(chan int)
go total(ch)
ch <- 1
ch <- 2
ch <- 3
fmt.Println("Total is ", <-ch)
}
Run Code Online (Sandbox Code Playgroud)
我想知道是否有人可以告诉我为什么我得到
throw: all goroutines are asleep - deadlock!
Run Code Online (Sandbox Code Playgroud)
谢谢
deadlock ×10
c# ×3
java ×2
sql ×2
sql-server ×2
.net-2.0 ×1
ado.net ×1
annotations ×1
channel ×1
go ×1
insert ×1
mysql ×1
pipe ×1
python ×1
spring ×1
stdout ×1
subprocess ×1
synchronized ×1
transactions ×1