在Spring中,如何在死锁/锁超时时重新启动事务?
使用Spring时,在死锁或锁定超时异常时实施交易的最佳实践是什么(特别是Spring推荐的方法:声明性交易)? 谢谢, asaf 解决方案 我觉得春天本身应该对这个问题有一个很好的答案(至少以文档的形式,或某种形式的重试拦截器). las,不是. 可能是处理重试的最佳方法(如果您想继续对事物进行"声明性")是编写自己的拦截器实现,该实现将自动重试交易次数.对于初学者,研究Spring's TransactionInterceptor,它可以管理/回滚/提交声明性交易的行为.如果您正在使用Hibernate,请注意它如何处理冬眠会话绑定/关闭当前线程. 如果您正在使用冬眠: 您的"重试拦截器"应确保解脱任何先前存在的线程冬眠会话,并重新启动新的会话.一旦从Hibernate/JDBC代码内抛出一个例外(例如,僵局),相应的Hibernate会话会中毒,需要丢弃. (session.clear()不够.) 如果您的交易服务方法使用Hibernate
2 2024-02-26
编程技术问答社区
安卓系统找到了一个僵局
当我运行Android服务时,我有时会得到ANR.我怀疑这是由于僵局而发生的. 是否有一种简单的方法来监视Android或Eclipse中的僵局.例如显示出哪个线程的实用程序? ,是否可以通过查看traces.txt文件来找出僵局? 我的DDMS日志在崩溃时看起来像这样 02-15 18:09:01.046: INFO/Process(90): Sending signal. PID: 450 SIG: 3 02-15 18:09:01.046: INFO/dalvikvm(450): threadid=3: reacting to signal 3 02-15 18:09:01.056: INFO/dalvikvm(450): Wrote stack traces to '/data/anr/traces.txt' 02-15 18:09:01.076: INFO/Process(90): Sending signal. PID: 10548 SIG: 9 02
0 2024-02-04
编程技术问答社区
Java同步方法
考虑此代码: public synchronized void onSignalsTimeout(List specs) { if (specs != null && specs.size() > 0) { for (SignalSpec spec : specs) { ParsedCANSignal timeoutedSignal = new ParsedCANSignal(); SignalsProvider.getInstance().setSignal(spec.name, spec.parent.parent.channel, timeoutedSignal); } } } 我有简单的问题: 当线程1调用onSignAlstimeout方法时,可以将2个在该方法中访问的访问对象进行线程? 如果"同步"锁定仅访问此方法或访问此方法中使用的所有对象
0 2024-01-29
编程技术问答社区
GoogleAuthUtil(Android中的Google Plus集成)的 "从你的主线程调用这个可能导致死锁和/或在获取accesToken时出现ANR"。
在我的Android应用程序中,我试图从下面的GoogleAuthutil获取访问权限: accessToken = googleauthutil.getToken(this,mplusclient.getaccountname()," oauth2:" + scopes); 但是,在这一行,我会出现以下错误: e/googleauthutil(4696):从主线程中调用此功能可能导致死锁和/或ANRS e/googleauthutil(4696):java.lang.illegalstateException:从主线程中调用此消息可能会导致死锁 E/googleauthutil(4696):在com.google.android.gms.auth.googleauthutil.b(未知来源) e/googleauthutil(4696):在com.google.android.gms.auth.googleauthutil.gettoken(未知来源) E/googl
4 2024-01-28
编程技术问答社区
MySQL亚马逊RDS:锁等待时间超时
在MySQL(Amazon RDS)上,当我尝试运行以下SQL查询 时 UPDATE table1 INNER JOIN table2 USING (CommonColumn) SET table1.col1 = table2.x, table1.col2 = table2.y 我在52秒后始终遇到此错误: Error Code: 1205. Lock wait timeout exceeded; try restarting transaction 我应该如何解决这个问题? Table2拥有约1700万个记录和Table2,这是Table1的一个子集具有400万个记录.可能是表的大小是问题,还是我的查询有问题? 解决方案 我重新启动了MySQL实例,并且可以使用相同的查询. 其他解决方案 如果您使用InnoDB引擎,请尝试增加IO线程的默认号码. rds默认为lighty4. show variables like 'i
4 2024-01-24
编程技术问答社区
Peterson'的算法是否满足饥饿感?
我一直在搜索 Peterson的algorithm 不满足饥饿,而只是僵局.这是真的?如果是这样,有人可以详细说明为什么不这样做? 彼得森的算法: flag[0] = 0; flag[1] = 0; turn; P0: flag[0] = 1; turn = 1; while (flag[1] == 1 && turn == 1) { // busy wait }
6 2024-01-22
编程技术问答社区
如果传感器数量大于并发数,Airflow celery worker将被阻塞?
假设,我将芹菜并发设置为 n ,但是我有 m ( m > n ) DAG中的externalTask​​Sensor将检查另一个名为 do_sth 的DAG,这些externalTask​​Sensor将消耗所有芹菜工人,因此没有人实际上会工作. 但我不能将同意的设置过高(例如2* m ),因为dag do_sth 可能会启动太多的过程,这会导致内存不足./p> 我感到困惑,我应该将什么号码设置为芹菜并发? 解决方案 在 eTl eTl eTL 作者解决了这个一般问题.建议之一是为传感器任务设置池,以使其他任务不会饿死.对于您的情况,确定要一次运行(小于并发级别)的传感器任务数量,并将其设置为限制.设置池后,将池参数传递给每个传感器操作员. 有关池的更多信息,请参见 airflow的概念文档.这是将池参数传递给运营商的示例: aggregate_db_message_job = BashOperator( task_id='aggregate_db_mes
2 2024-01-20
编程技术问答社区
jvmti代理死锁
当我使用Java程序运行JVMTI代理时,JVM似乎遇到了僵局. 在我的JVMTI代理中,我在Agent_onload()中创建一个RAW监视器,并在每个回调功能的开头输入该锁定,然后在每个回调函数的末尾退出该锁定. 我不知道这个僵局的原因. JVMTI代理商还有其他僵局吗? 谢谢. 解决方案 是的,JVMTI代理有可能发生僵局. P> 相同的线程可能会进一步输入监视器.线程必须 退出显示器的次数与输入相同的次数.如果一个 监视器是在撞击过程中输入的(存在附件之前)和 连接的线程成立时尚未退出,输入为 被认为是在主线程上发生的. 在这种情况下可能很难进行远程诊断,但我建议您看看 demo jvmti应用程序处理 RAW锁的使用.使用专用函数enter_critical_section和exist_critical_section.也许有帮助,否则尝试找到回调,从而通过调试代理来导致死锁. 当许多线程同时调用JVMTI代理时,我遇到了同样的问题.一个线程成功地调
0 2024-01-19
编程技术问答社区
交易范围过早完成
我有一个在TransactionsCope中运行的代码块,并且在代码的此块中,我对DB进行了多次调用.选择,更新,创建和删除,整个范围.当我执行删除时,我会使用SQLCommand的扩展方法执行它,该方法将自动重新提交查询,如果此查询可能会陷入困境,该查询可能会遇到僵局. 我相信,当僵局击中僵局并且该功能试图重新提交查询时,就会发生问题.这是我收到的错误: 与当前连接相关的交易已经完成,但尚未处理.交易必须在连接执行SQL语句之前处置. 这是执行查询的简单代码(以下所有代码在使用TransactionsCope中执行): using (sqlCommand.Connection = new SqlConnection(ConnectionStrings.App)) { sqlCommand.Connection.Open(); sqlCommand.ExecuteNonQueryWithDeadlockHandling(); } 这是重新提交僵
4 2024-01-19
编程技术问答社区
如何在C#中用ADO获得高效的Sql Server死锁处理?
我有一个"数据库",可作为ado.net的包装器.例如,当我需要执行一个过程时,我会调用数据库.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 != enumDatabaseTyp
2 2024-01-19
编程技术问答社区
同步到异步调度:如何避免死锁?
我正在尝试创建一个具有同步方法的类,并调用其他一些异步的库方法.因此,我使用Task.Result等待异步操作完成. WPF应用程序以同步方式调用我的方法.这导致了僵局.我知道最好的方法是使我所有的方法异步,但我的情况要求它们同步.另一方面,他们使用其他异步库. 我的问题是:如何在这种情况下避免僵局? 复制的步骤: 用户在应用程序(方法Button1_OnClick) 中点击一个按钮 此方法创建一个IPlugin的实例,然后调用其方法RequestSomething() 此方法然后以这种方式调用异步库:asyncTarget.MethodFromAsyncLibrary("HelloFromPlugin").Result 库回电NotifyNewValueProgressAsync() NotifyNewValueProgressAsync()将调用回到WPF应用程序 由于UI上下文被此行阻止了步骤5中的回调. 请参阅下面的代码示例
8 2024-01-07
编程技术问答社区
在简单的API客户端中,异步任务从未结束。死锁?
我是C#的新手,我很可能会误解等待异步和任务的适当用法:) 我想开发一个作为我应用的API客户端的类(OWConnector),为此,我开发了一种执行发布请求的通用PostRequest方法. 不幸的是,当我用户使用auth方法时,该应用看起来像是陷入僵局(使用通用方法PostRequest). 您能帮我了解问题所在吗?我在代码中标记了调试器永远等待的代码. // the debugger get stacked here :( 形式方法 private void btnAnalyze_Click(object sender, EventArgs e) { OWConnector api = new OWConnector(@"http://mywebsite.com/"); Boolean didAuth = api.auth("myuser", "mypass"); if (didAuth) { M
4 2024-01-07
编程技术问答社区
.NET进程-重定向stdin和stdout而不引起死锁
我正在尝试从程序生成的帧中用ffmpeg编码一个视频文件,然后将FFMPEG的输出重定向到我的程序,以避免使用中间视频文件. 但是,当文档的评论中提到的 system.diarostic.process.diarostic.process 中,我遇到了一个相当普遍的问题./sdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo.redirectstandardoutputputput(v = vs.110).aspx" rel =" nofollow noreferrer">在这里,这会导致僵局如果同步运行. 将我的头发撕开了一天之后,尝试在网上找到几种建议的解决方案,我仍然找不到使它起作用的方法.我收集了一些数据,但是该过程总是在完成之前冻结. 这是一个产生上述问题的代码段: static void Main(string[] args) { Process
2 2024-01-06
编程技术问答社区
WinForms中的死锁可以通过右键点击任务栏来防止。
我在Windows C#/.NET应用程序中遇到了一个奇怪的问题.实际上,这是一个GUI应用程序,我的工作是包含在汇编中的网络组件. 我不知道主/GUI应用程序的代码,我可以联系其开发人员. 现在,应用程序的UI具有"启动"和"停止"网络引擎的按钮.两个按钮都可以. 为了使我的组件螺纹保护措施,我使用的是三种方法围绕锁定.我不希望客户在完成()完成之前都能致电stop().附加的有一个投票计时器. 我试图向您展示尽可能少的行并将问题提示: private Timer actionTimer = new Timer(new TimerCallback(actionTimer_TimerCallback), null, Timeout.Infinite, Timeout.Infinite); public void Start() { lock (driverLock) { active = true
2 2024-01-05
编程技术问答社区
在.NET 4 TPL中杀死一个陷入僵局的任务
我想开始使用任务平行库,因为这是执行异步操作的推荐框架.我找不到的一件事是任何强制堕胎的方法,例如thread.bobort提供的. 我特别关心的是,我安排了运行我不希望完全信任的代码的任务.特别是,我不能确定此不信任的代码不会死锁,因此我无法确定我使用此代码的任务是否会完成.我想远离真正的AppDomain隔离(由于安排的开销和复杂性),但我也不想留下一个任务线,陷入僵局.有没有办法在tpl? 中这样做 解决方案 这样做的方法是通过取消token和新的取消模型. 新的取消模型以几种类型集成到.NET框架中.最重要的是system.threading.tasks,system.threading.tasks.task,system.threading.tasks.tasks.task和system.linq.parallelenumosit. 这是您问题的示例.该代码将始终僵局,因为通话代码首先采用锁定,然后僵局的任务试图使同一锁定. public void Ex
2 2024-01-05
编程技术问答社区
任务.运行在同一个线程上继续,导致死锁
考虑我将同步等待的以下异步方法.我知道一秒钟.我知道这被认为是不良习惯,造成僵局,但我完全 norreferrer ">并采取措施通过用 task.run . private async Task BadAssAsync() { HttpClient client = new HttpClient(); WriteInfo("BEFORE AWAIT"); var response = await client.GetAsync("http://google.com"); WriteInfo("AFTER AWAIT"); string content = await response.Content.ReadAsStringAsync(); WriteInfo("AFTER SECOND AWAIT"); return con
6 2024-01-05
编程技术问答社区
WinDbg-TraceListener和饱和线程池
我有一个多线程.NET Windows Service间歇性地悬挂的 - 也许每两周24/7操作一次.当挂起发生时,ThreadPool完全饱和,因为呼叫我们的自定义Tracelistener出于某种原因开始阻止.有问题的代码中没有任何锁,也没有根据WindBG封锁的任何锁,但是它们肯定会阻止某个地方.堆栈上也没有任何例外.有一个螺纹.sleep(1),偶尔会在bufferedstream.write代码中击中,但我的问题是,什么是重新启动的mmetadatawithmemory,createApplicationContext,dllcanunloadnow表示? ? 几乎所有2000的挂断工具线(不是正常操作!)都具有与以下几个相似的堆栈: 0:027> !dumpstack OS Thread Id: 0x1638 (27) Child-SP RetAddr Call Site 000000001d34df58 0000000077d
2 2024-01-04
编程技术问答社区
C# Threading.Suspend in Obsolete, thread has been deprecated?
在我的应用程序中,我正在通过另一个线程(GUI线程除外)执行文件阅读.有两个按钮分别悬挂并恢复线程. private void BtnStopAutoUpd_Click(object sender, EventArgs e) { autoReadThread.Suspend(); } private void BtnStartAutoUpd_Click(object sender, EventArgs e) { autoReadThread.Resume(); } ,但我面临警告, 线程已弃用.请在System.Threading中使用其他类,例如Monitor,Mutex,Event和Semaphore,以同步线程或保护资源. http://go.microsoft.com/f.microsoft.com/fwlink/?/p> 无论如何,我只运行一个线程(而不是GUI线程),因此如何在此处或监视器应用同步. 更新代码: class
18 2024-01-04
编程技术问答社区
使用lock(this)来说明死锁的示例代码
我已经阅读了几篇文章和帖子,上面说lock(this),lock(typeof(MyType)),lock("a string")都是不良练习,因为另一个线程可以锁定同一键并造成僵局.为了理解这个问题,我试图创建一些示例代码来说明僵局,但无法将我的头缠住. 有人可以写出简明的代码来说明这个经典问题吗?请简短,我只能在较小的块中消化代码. 编辑: 我认为lassevk总结得很好.真正的问题是您失去了对锁的控制权.一旦发生这种情况,您就无法控制锁的命令,并且您允许潜在的死锁情况. lock(this),lock(typeof(MyType))等都是您选择无法控制的锁的情况. 解决方案 只有在您有一个以上的锁定时,才会发生僵局.您需要两个线程都有其他需求的资源(这意味着必须有两个资源,并且两个线程必须尝试以不同的顺序获取它们) ) 所以一个简单的例子: // thread 1 lock(typeof(int)) { Thread.Sleep(1000
0 2024-01-03
编程技术问答社区