我们的生产系统遇到了一个非常奇怪的问题.不幸的是,尽管付出了很多努力,但我还是无法在本地重现这个问题,因此我无法提供最小,完整和可验证的示例.此外,由于这是生产代码,我不得不在以下示例中更改表的名称.不过,我相信我会提出所有相关事实.
我们有四个表bucket_holder,bucket,item并bucket_total创建如下:
CREATE TABLE bucket_holder (
id SERIAL PRIMARY KEY,
bucket_holder_uid UUID NOT NULL
);
CREATE TABLE bucket (
id SERIAL PRIMARY KEY,
bucket_uid UUID NOT NULL,
bucket_holder_id INTEGER NOT NULL REFERENCES bucket_holder (id),
default_bucket BOOLEAN NOT NULL
);
CREATE TABLE item (
id SERIAL PRIMARY KEY,
item_uid UUID NOT NULL,
bucket_id INTEGER NOT NULL REFERENCES bucket (id),
amount NUMERIC NOT NULL
);
CREATE TABLE bucket_total (
bucket_id INTEGER NOT NULL REFERENCES …Run Code Online (Sandbox Code Playgroud) 我们有 2 个表定义如下
CREATE TABLE foo (
id BIGSERIAL PRIMARY KEY,
name TEXT NOT NULL UNIQUE
);
CREATE TABLE bar (
foo_id BIGINT UNIQUE,
foo_name TEXT NOT NULL UNIQUE REFERENCES foo (name)
);
Run Code Online (Sandbox Code Playgroud)
我注意到在同时执行以下两个查询时
INSERT INTO foo (name) VALUES ('BAZ')
Run Code Online (Sandbox Code Playgroud)
INSERT INTO bar (foo_name, foo_id) VALUES ('BAZ', (SELECT id FROM foo WHERE name = 'BAZ'))
Run Code Online (Sandbox Code Playgroud)
在某些情况下,最终可能会在barwhere foo_idis 中插入一行NULL。这两个查询由两个完全不同的进程在不同的事务中执行。
这怎么可能?我希望第二条语句要么由于外键违规而失败(如果记录foo不存在),要么以非空值foo_id(如果是)成功。
是什么导致了这种竞争条件?是由于子选择,还是由于检查外键约束的时间?
我们使用隔离级别“已提交读”和 postgres 10.3 版。
编辑
我认为这个问题并不清楚是什么让我感到困惑。问题是关于在执行单个语句期间如何以及为什么观察到数据库的 2 个不同状态。subselect 观察到 foo 中的记录不存在,而 …
Java 17 引入了一个RandomGeneratorFactory用于实例化随机数生成器的新类。该create(long)方法描述为
创建一个
RandomGenerator基于所选算法的实例,提供起始长种子。如果算法不支持长种子,则使用无参数形式的 create。
然而,似乎没有一种方法RandomGeneratorFactory可以用来确定是否long支持种子。如何使用新 API 来获取RandomGenerator保证使用提供的种子创建的实例long?
我试图做一个vector能容纳string和int.
我已经尝试了下面的代码,但是我得到了编译错误
错误:使用已删除的函数'my_union :: ~my_union()'
我究竟做错了什么?
#include <iostream>
#include <vector>
using namespace std;
union my_union
{
string str;
int a;
};
int main()
{
vector<my_union> v;
my_union u; // error: use of deleted function 'my_union::~my_union()'
u.str = "foo";
v.push_back(u);
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一个测试来检查我在代码中创建的 Excel 文件是否与资源文件完全相同(相同的格式、相同的单元格内容等)。
一种想法是转换为字节数组并检查字节数组是否相等。不幸的是,我在使用这种方法时遇到了麻烦,因为 excel 格式似乎包含文件创建时间的时间戳。
例如,此代码打印false.
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.ByteArrayOutputStream;
import java.util.Arrays;
public class Main {
public static void main(String[] args) throws Exception {
Workbook workbook1 = new XSSFWorkbook();
ByteArrayOutputStream baos1 = new ByteArrayOutputStream();
workbook1.write(baos1);
byte[] bytes1 = baos1.toByteArray();
Thread.sleep(1000);
Workbook workbook2 = new XSSFWorkbook();
ByteArrayOutputStream baos2 = new ByteArrayOutputStream();
workbook2.write(baos2);
byte[] bytes2 = baos2.toByteArray();
System.out.println(Arrays.toString(bytes1));
System.out.println(Arrays.toString(bytes2));
System.out.println(Arrays.equals(bytes1, bytes2));
}
}
Run Code Online (Sandbox Code Playgroud)
有谁知道解决这个问题的方法。是否可以创建XSSFWorkbook保证相同的实例?或者有另一种解决这个问题的方法吗?
我试图在终端中使用 psql 来查找数据库中所有可为空的列。如果我使用
select * from information_schema.check_constraints;
Run Code Online (Sandbox Code Playgroud)
我得到如下信息
constraint_catalog | constraint_schema | constraint_name | check_clause
--------------------+--------------------+------------------------------+----------------------------------------------------------------------------------------------
foo | public | 12345_67890_1_not_null | bar IS NOT NULL
Run Code Online (Sandbox Code Playgroud)
不幸的是,该bar列出现在许多表中。我可以获得public像这样列出列名和表名的所有约束的列表的最简单方法是什么?
如何使用某个局部变量创建一个始终排序元素的集合?
我想要做的一个简单的例子就是这个.
int x[5] {9, 2, 3, 1, 8};
set<int, ???> my_set;
my_set.insert(0);
my_set.insert(1);
my_set.insert(4);
for (int a : my_set)
cout << a << " "; // I want the answer 1 4 0 because x[1] < x[4] < x[0]
Run Code Online (Sandbox Code Playgroud)
我想我可能能够使用a来做到这一点struct,但我不确定如何使用x改变的东西.
Java 17 添加了新的RandomGenerator接口。然而,似乎所有新的实现都不是线程安全的。在多线程情况下使用新接口的推荐方法是在生成新线程时使用原始线程SplittableRandom并进行调用。split但是,在某些情况下,您无法控制生成新线程的代码部分,而只需在多个线程之间共享一个实例。
我可以使用Random,但这会因为所有同步而导致争用。也可以使用ThreadLocalRandom,但我不愿意这样做,因为这个类现在被认为是“遗留的RandomGenerator”,并且因为这不会给我一个没有全部样板负载的线程安全实现:
new RandomGenerator() {
@Override
public int nextInt() {
return ThreadLocalRandom.current().nextInt();
}
@Override
public long nextLong() {
return ThreadLocalRandom.current().nextLong();
}
...
}
Run Code Online (Sandbox Code Playgroud)
对我来说,这似乎是新 API 中相当基本的差距,但我可能会遗漏一些东西。获得线程安全实现的惯用 Java 17 方法是什么RandomGenerator?
假设我有一个map<string, vector<int>>被叫my_map,我想要42关键"foo".来自Java我希望不得不做这样的事情
if (my_map.find("foo") != my_map.end()) {
my_map["foo"].push_back(42);
} else {
vector<int> my_vector;
my_map["foo"] = my_vector;
my_vector.push_back(42);
}
Run Code Online (Sandbox Code Playgroud)
令我惊讶的是,我发现我可以做到
my_map["foo"].push_back(42);
Run Code Online (Sandbox Code Playgroud)
这是如何运作的?my_map["foo"]如果地图的值类型没有没有参数的构造函数,会怎么做?假设您想以除使用空构造函数之外的方式初始化所有值?在Java中,我能做到
map.computeIfAbsent("foo", **some supplier of Vectors**).add(42);
Run Code Online (Sandbox Code Playgroud)
C++中有等价的吗?
c++ ×3
java ×3
postgresql ×3
concurrency ×2
java-17 ×2
random ×2
sql ×2
constraints ×1
dictionary ×1
excel ×1
foreign-keys ×1
psql ×1
set ×1
subquery ×1
unions ×1
xssf ×1