小编Kug*_*itz的帖子

SQL:多对多关系和“ALL”子句

我有一个表products和一个表locations,它们以多对多关系与 table 链接在一起products_locations。现在,客户可以选择一组产品,我想运行一个查询,仅选择所有选定产品均可用的位置。

乍一看这似乎很简单,但我发现自己对如何实现这一目标感到非常困惑。我最初以为我可以用类似的东西获得所有正确的位置ID

SELECT location_id
FROM products_locations
WHERE product_id = ALL [the user selected product ids]
Run Code Online (Sandbox Code Playgroud)

但转念一想,这似乎也没有意义( 的结构products_locations非常简单[product_id, location_id]

任何有关如何构建此类查询的建议将不胜感激。我觉得我忽略了一些基本的东西..

编辑:我正在使用mysql语法/方言

快速示例:给出下表

| products   | | locations | | products_locations       |
| id | name  | | id | name | | product_id | location_id |
|------------| |-----------| |--------------------------|
| 1  | prod1 | | 1  | locA | | 1          | 2           |
| 2  | …
Run Code Online (Sandbox Code Playgroud)

mysql sql relational-division

5
推荐指数
1
解决办法
1045
查看次数

ReentrantReadWriteLock 多个读线程

再会

我有一个有关 ReentrantReadWriteLocks 的问题。我正在尝试解决一个问题,其中多个读取器线程应该能够在数据结构上并行操作,而一个写入器线程只能单独操作(同时没有读取器线程处于活动状态)。我正在使用 Java 中的 ReentrantReadWriteLocks 来实现这一点,但是从时间测量来看,读取器线程似乎也相互锁定。我认为这不应该发生,所以我想知道我是否实施错误。我的实现方式如下:

readingMethod(){
    lock.readLock().lock();
    do reading ...
    lock.readLock().unlock();
}

writingMethod(){
    lock.writeLock().lock();
    do writing ...
    lock.writeLock().unlock();
}
Run Code Online (Sandbox Code Playgroud)

其中读取方法被许多不同的线程调用。从测量时间来看,即使从未调用写入方法,读取方法也会按顺序执行!关于这里出了什么问题有什么想法吗?提前谢谢你-干杯

编辑:我试图提出一个 SSCCE,我希望这一点很清楚:

public class Bank {
private Int[] accounts;
public ReadWriteLock lock = new ReentrantReadWriteLock();

// Multiple Threads are doing transactions.
public void transfer(int from, int to, int amount){
    lock.readLock().lock(); // Locking read.

    // Consider this the do-reading.
    synchronized(accounts[from]){
        accounts[from] -= amount;
    }
    synchronized(accounts[to]){
        accounts[to] += amount;
    }

    lock.readLock().unlock(); // Unlocking read.
}

// Only one thread …
Run Code Online (Sandbox Code Playgroud)

java concurrency multithreading locking thread-safety

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