我有一个grails应用程序,它依赖于服务中的同步块。当我在Windows上运行它时,同步可以按预期工作,但是当我在ams
linux上运行时,会收到StaleObjectStateException。
在下面的示例中重现该问题。
class TestService {
private final Object $lock = new Object[0];
TesteSync incrementa() {
synchronized ($lock) {
TesteSync t = TesteSync.findById(1)
t.contador++
t.save(flush: true)
Thread.sleep(10000)
return t
}
}
}
据我了解,发生此异常是因为多个线程正在尝试保存同一对象。这就是为什么我使用同步块。
Linux Java:
Windows Java:
有什么线索吗?
谢谢
您为什么要获取 StaleObjectStateException 是正确的。
如果您要查找的是悲观锁定(在任何给定时间只允许一个事务访问数据),则可以使用域类 lock() 方法:
class TestService {
static transactional = true
TesteSync incrementa() {
TesteSync t = TesteSync.lock(1)
t.contador++
return t.save()
}
}
您可以在此处了解更多有关Grails悲观锁定的信息。
PS:默认情况下,Grails服务是事务性的。但是在我的示例中,我显式地使服务成为事务性的,以引起您的注意:Grails
在事务提交时自动释放锁定。我还删除了刷新,因为在事务提交时数据将被刷新。如果您是通过未显式设置为
@Transactional 的控制器方法执行此操作的,则需要进行刷新。
提示:通过ID查询时,您可以执行此操作…
SomeDomainClass.get(1)
而不是这个
SomeDomainClass.findById(1)
这个问题在下面的示例中重现。 } 据我所知,发生此异常是因为多个线程试图保存同一个对象。这就是我使用同步块的原因。 null null
我们有一个内部开发的基于客户机/服务器的应用程序。客户端和服务器通过TCP/IP连接与特定于应用程序的协议进行通信。客户端在Windows上运行,服务器在Linux上运行。所有计算机都位于相同的Active Directory/Kerberos域/领域中。 目前,用户在启动应用程序时输入用户名和密码。服务器检查用户名和密码(身份验证)。服务器还根据用户名确定对资源的访问(授权)。 我们希望向应用程
我正在使用VS代码来调试使用Windows Subsystem for Linux的'C'代码。我基本上想用一个基于linux的编译器来编译“C”代码,用于操作系统的课程。我已将Visual Studio代码上的默认终端设置为“wsl”。单击debug按钮时,我会得到以下错误“无法开始调试”。miDebuggerPath的值无效“我验证了'gdb'安装在Windows Subsystem for
问题内容: 我最近开始在同一台PC上使用Windows和Linux- 它们安装在两个不同的分区中,第三个分区包含公用数据和存档。从Windows创建的virtualenvs使用文件夹“ Scripts”创建,而Linux中的对应文件是文件夹“ bin”。 这里的问题是这些文件夹中的文件不适用于两个操作系统。例如,bin(在Linux中创建)中包含的“激活”不在Windows中运行,另一方面,在Wi
问题内容: 我在应用程序中使用selenium-server,selenium rc进行UI测试。我的开发箱是带有FireFox 3.5的Windows,一切运行正常。但是当我尝试在我的构建服务器(是linux机器)上运行selenium测试时,出现此错误 基本上,selenium-rc无法在Linux(实际上是.sh文件)上找到Firefox可执行文件,在Windows中是存在的。 有人遇到过这
无法在linux上使用ElasticSearch映射logstash 我只是运行下面的命令,它显示了docker上所有正在运行的图像 sudo docker ps 输出: 我只想将logstash链接到弹性搜索并尝试运行以下命令 命令: 输出: 989e2a8f4d9fd972c4f2102d726a68877c989b546800899abbb8c382fb62f04c logstash。形态: