我想知道是否同时 UPDATE .... LIMIT N 不会与查询数据库的多个客户端重叠。
在 UPDATE ... LIMIT N 之后,客户端将使用分配的一些 client_id 进行 SELECT。我不希望客户端重叠结果,因此每次更新后使用 SELECT 查询数据库时,每个客户端都会有不同的记录。
这取决于表引擎?
更新锁定表/记录?(我确定这取决于引擎)。
我认为 UPDATE LIMIT 不应重叠结果,dbs 具有 ACID 属性......我想确认这一点。
MySQL 的最新版本(使用 InnoDB)支持许多没有独占锁定表的更改表查询。
PostgreSQL 是否支持任何级别?也就是说,我可以在同时读取/写入行的同时从表中添加/删除列吗(即使性能下降)?
说我有表users,teams和teams_users结表(team_ID,user_ID/复合PK)。如果我想将用户添加到团队中,那么在性能/并发问题方面,最佳选择是什么?
首先查询表并查看关系是否已经存在,如果它只是通知发出请求的用户。
插入时,使用WHERE EXISTS语法(第二个示例)。
将 Postgres 9.5 Beta 用于 UPSERT 功能。(我想在学校项目中使用 Beta 版本不是一个坏主意吗?)。
在并发方面,哪种选择最好。我对 SQL 不是很有经验(只是 CRUD 应用程序的标准内容)。但据我所知,在第一个选项中,另一个用户可以在查询联结表之后但在自己实际插入关系之前插入关系。我想不会有任何重复项,因为我在该联结表中有一个复合主键,但我觉得让它成为例外并继续是不好的做法。此外,在我当前的代码中,在这种情况下我会返回 500 http 状态(因为 db 异常),这似乎并不正确。
我读过我可以通过“锁定”数据库/表来部分解决上述问题,但我不知道这是否是正确的方法。
最后,我不知道第二个选项是否存在竞争条件。
我遇到了死锁问题,所以我开始使用我在某处读到的这个 CTE 技巧。没有更多的僵局。
但是现在我添加的每个客户端都会减慢(阻止?)存储过程。例如,1 个客户端的 1-2 秒更新变为两个客户端的 2-4 秒。(这个简单的隐喻查询运行时间为 0.001 秒,但在少数客户之后达到 0.03 秒——所以这个问题与我的实际实现无关。)
是锁定问题吗?我需要将它包装在(某种)交易中吗?
WITH UpdateView AS (
SELECT TOP 1 W.*
FROM [WidgetSandbox].[dbo].[Widgets] W
INNER JOIN [WidgetSandbox].[dbo].[Sizes] S ON W.SizeId = S.Id
WHERE W.StatusId = @availableStatusId
AND W.ColorCode = @colorCode
ORDER BY S.DiameterInches
)
UPDATE UpdateView
SET StatusId = @soldOutStatusId
OUTPUT INSERTED.Id INTO @outputIds;
SET @singleUpdatedId = (SELECT TOP 1 Id FROM @outputIds);
SELECT * FROM [WidgetSandbox].[dbo].[Widgets]
WHERE Id = @singleUpdatedId;
Run Code Online (Sandbox Code Playgroud)
我希望我能更好地了解具体问题是什么,但事实上我只是被卡住了......
DDL,如果有帮助:https : //gist.github.com/RobertBaldini/3740c7bb85eea47d7fe63cb8602ac2d6
回购:https : …
我想构建一个函数,如果表中不存在电子邮件值并返回email_id行的值,则该函数将插入电子邮件。我怎样才能做到这一点?
另外,如果电子邮件没有插入并且它已经存在于数据库中,我该如何返回 ID?我需要执行另一个SELECT吗?
BEGIN;
LOCK TABLE mailing_list IN SHARE ROW EXCLUSIVE MODE;
INSERT INTO mailing_list (email)
SELECT 'email'
WHERE NOT EXISTS (
SELECT * FROM mailing_list WHERE email='email'
);
COMMIT;
Run Code Online (Sandbox Code Playgroud)
我试过添加,returning id但它不起作用。我有:
查询没有结果数据的目的地
今天我在PostgreSQL 9.5上发现了一些奇怪的东西。(我不知道这是否是因为测试版。)当我想获取数据时,我会从查询中获取旧的和已删除的数据。VACUUM FULL然后我做,然后我得到正确的数据(这是空的)。
我在这里错过了什么吗?PostgreSQL 返回旧数据的原因可能是什么?
注意:自动真空是ON.
postgresql concurrency transaction isolation-level postgresql-9.5
如果我创建一个表。
CREATE TABLE foo AS
SELECT CASE WHEN random() > 0.5 THEN x END AS x
FROM generate_series(1,10) AS x;
Run Code Online (Sandbox Code Playgroud)
然后我在事务中运行以下命令
BEGIN;
SELECT count(*)
FROM foo
WHERE x IS NOT NULL;
--time
SELECT count(*)
FROM foo
WHERE x IS NOT NULL;
END;
Run Code Online (Sandbox Code Playgroud)
在什么交易级别下我的结果保证在交易中保持不变?
我公司想了解一下效果:
如果我们有一个带有主键标识列的表,int 主键 IDENTITY(1,1),
并且应用程序正在进行多线程并行处理,试图在一张表上同时进行 1000 次插入。
身份主键列是否会失败,以任何方式违反主键,例如:处理器正在尝试输入相同的身份编号?
或者 SQL 被设计成即使在多线程并行插入中也能成功?
注意:IDENTITY_INSERT 关闭
database-design sql-server primary-key concurrency multi-thread
如何使用基于交易的策略来确保同一地点在同一天不能被多次预订?
有人向我建议,每个隔离级别都会有所不同。你能为他们每个人添加一个例子吗?( read committed,repeatable read和serializable)。我想了解他们中的每一个人。
以下是表格和测试数据:
CREATE TABLE place (
place_id INT PRIMARY KEY,
Name CHARACTER VARYING(50) NOT NULL,
Type CHARACTER VARYING(50) NOT NULL
);
CREATE TABLE visit (
visit_id SERIAL PRIMARY KEY,
place_id INT NOT NULL,
place_dt TIMESTAMP NOT NULL,
FOREIGN KEY (place_id) REFERENCES place(place_id)
);
INSERT INTO place(place_id, Name, Type
) VALUES
(1, 'Denali', 'mountain'),
(2, 'Brindley', 'mountain'),
(3, 'St. Louis Cathedral', 'church')
;
INSERT INTO visit(place_id, place_dt
) VALUES
(1, '2019-01-02 10:00'), …Run Code Online (Sandbox Code Playgroud) 我正在尝试在生产中同时创建索引。\d然而,这样做时,通过查看时的索引会显示INVALID。
为什么会这样呢?以前从未见过这种情况发生。
尝试过重新创建,但仍然遇到同样的问题:
指数:
create index concurrently idx_wallet_customer_id_credit_stake_expires on wallet (customer_id,wallet_credit_stake,wallet_expires)
where wallet_closed is null and wallet_staked is null;
Run Code Online (Sandbox Code Playgroud) concurrency ×10
postgresql ×7
locking ×3
transaction ×3
mysql ×2
sql-server ×2
ddl ×1
deadlock ×1
index ×1
insert ×1
multi-thread ×1
mvcc ×1
plpgsql ×1
primary-key ×1
query ×1