Tag: 竞争条件

私人构造函数,以避免竞争条件

我正在阅读Java Concurrency in Practice会话4.3.5 @ThreadSafe public class SafePoint{ @GuardedBy("this") private int x,y; private SafePoint (int [] a) { this (a[0], a[1]); } public SafePoint(SafePoint p) { this (p.get()); } public SafePoint(int x, int y){ this.x = x; this.y = y; } public synchronized int[] get(){ return new int[] {x,y}; } public synchronized void set(int x, […]

如何从wordpress数据库获取最后插入的行ID?

我的wordpress插件有一个名为ID的AUTO_INCREMENT主键字段的表。 当一个新行插入到表中时,我想获取插入的ID值。 function是使用AJAX将数据发布到服务器以插入到数据库中。 新的行ID在AJAX响应中返回以更新客户端状态。 多个客户端可能同时向服务器发布数据。 所以,我必须确保每个AJAX请求都得到正确的新行ID作为响应。 在PHP中,这个特性有一个名为mysql_insert_id的方法。但是,只有当参数是最后一个操作的link_identifier时,它才适用于竞争条件。 我对数据库的操作是$ wpdb。 如何从$ wpdb中提取link_identifier以确保mysql_insert_id工作? 有没有其他的方法来从$ wpdb获取最后插入的行ID? 谢谢。

!=检查线程是否安全?

我知道像i++这样的复合操作不是线程安全的,因为它涉及多个操作。 但检查参考与自己的线程安全操作? a != a //is this thread-safe 我试图编程,并使用多个线程,但没有失败。 我想我无法在我的机器上模拟比赛。 编辑: public class TestThreadSafety { private Object a = new Object(); public static void main(String[] args) { final TestThreadSafety instance = new TestThreadSafety(); Thread testingReferenceThread = new Thread(new Runnable() { @Override public void run() { long countOfIterations = 0L; while(true){ boolean flag = instance.a != […]

MySQL INSERT IF(自定义if语句)

首先,下面是问题的简要总结: 是否有可能有条件地运行INSERT语句? 类似这样的东西: IF(expression) INSERT… 现在,我知道我可以用存储过程来做到这一点。 我的问题是:我可以在我的查询中做到这一点? 现在,我为什么要这样做呢? 假设我们有以下两个表格: products: id, qty_on_hand orders: id, product_id, qty 现在,让我们来说20个巫毒娃娃(产品编号2)的订单进来。 我们首先检查手头是否有足够的数量: SELECT IF( ( SELECT SUM(qty) FROM orders WHERE product_id = 2 ) + 20 <= ( SELECT qty_on_hand FROM products WHERE id = 2) , 'true', 'false'); 然后,如果它评估为真,我们运行一个INSERT查询。 到现在为止还挺好。 但是,并发性有问题。 如果两个订单在同一时间进入,他们可能都会在其中任何一个订单进入之前阅读手头数量。 然后他们会下订单,从而超过qty_on_hand 。 所以,回到问题的根源: 是否可以有条件地运行INSERT语句,以便我们可以将这两个查询合并为一个? 我search了很多,我能find的唯一一种条件INSERT语句是ON DUPLICATE […]

primefaces更新..在Postgres中select

我正在build立一个排队机制。 有一些需要处理的数据行和一个状态标志。 我正在使用update .. returning子句来pipe理它: UPDATE stuff SET computed = 'working' WHERE id = (SELECT id from STUFF WHERE computed IS NULL LIMIT 1) RETURNING * 嵌套的select部分是否与更新相同,还是在这里有竞争条件? 如果是这样,内部select是否需要select for update ?

SQL Server进程队列争用条件

我有一个通过存储过程由多个订单处理器访问的订单队列。 每个处理器传入一个唯一的ID,用于locking下一个20个订单,供自己使用。 存储过程然后将这些logging返回到订单处理器以执行操作。 在某些情况下, 多个处理器可以检索同一个“OrderTable”logging ,并在这个logging上尝试同时对其进行操作。 这最终导致过程中稍后抛出错误。 我的下一步行动是让每个处理器抓取所有可用的命令,并循环处理器,但是我希望简单地使这部分代码线程安全,并允许处理器随时抓取logging。 所以明确 – 任何想法,为什么我遇到这种竞争条件,以及如何解决问题。 BEGIN TRAN UPDATE OrderTable WITH ( ROWLOCK ) SET ProcessorID = @PROCID WHERE OrderID IN ( SELECT TOP ( 20 ) OrderID FROM OrderTable WITH ( ROWLOCK ) WHERE ProcessorID = 0) COMMIT TRAN SELECT OrderID, ProcessorID, etc… FROM OrderTable WHERE ProcessorID = @PROCID

什么是比赛条件?

在编写multithreading应用程序时,遇到的最常见的问题之一就是竞争条件。 我对社区的问题是: 什么是比赛条件? 你如何检测他们? 你如何处理它们? 最后,你如何防止它们发生?

SELECT或INSERT在一个容易出现竞争条件的函数中?

我写了一个函数来创建一个简单的博客引擎的帖子: CREATE FUNCTION CreatePost(VARCHAR, TEXT, VARCHAR[]) RETURNS INTEGER AS $$ DECLARE InsertedPostId INTEGER; TagName VARCHAR; BEGIN INSERT INTO Posts (Title, Body) VALUES ($1, $2) RETURNING Id INTO InsertedPostId; FOREACH TagName IN ARRAY $3 LOOP DECLARE InsertedTagId INTEGER; BEGIN — I am concerned about this part. BEGIN INSERT INTO Tags (Name) VALUES (TagName) RETURNING Id INTO […]