我正在阅读有关InnoDB's 隔离级别的内容,这在很大程度上是有道理的,但我不明白为什么是unrepeatable reads一件坏事?不应该反过来吗?
举些例子:
因此,假设我们有一个用于销售产品的库存列,每次有人购买一件商品时,我们都会从该列中取出 1 件商品,使用Repeatable read或serializable隔离级别会不会破坏数据完整性?
例如:
TX A: start transaction;
TX B: set session transaction isolation level repeatable read;
TX B: start transaction;
TX A: select stock from products; -- val = 8
TX B: select stock from products; -- val = 8
TX A: update products set stock = stock - 1; -- val = 7
TX B: select stock from products; -- val = 8
TX A: …Run Code Online (Sandbox Code Playgroud) 假设您有一个具有以下定义的表:
CREATE TABLE public.positions
(
id serial,
latitude numeric(18,12),
longitude numeric(18,12),
updated_at timestamp without time zone
)
Run Code Online (Sandbox Code Playgroud)
您在此表中有 50,000 行。现在出于测试目的,您将运行如下更新:
update positions
set updated_at = now()
where latitude between 234.12 and 235.00;
Run Code Online (Sandbox Code Playgroud)
该语句将从 50,000 行(在此特定数据集中)更新 1,000 行。
如果您在 30 个不同的线程中运行这样的查询*,MySQL innodb 将成功,而 PostgreSQL 将因大量死锁而失败。
为什么?
* 我正在比较最新版本的 MySQL innodb 与 Postgres,这是一个并发更新案例。生产案例:想象有 5000 只库存不断更新,最新价格不断可用。
如何使用基于交易的策略来确保同一地点在同一天不能被多次预订?
有人向我建议,每个隔离级别都会有所不同。你能为他们每个人添加一个例子吗?( 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) 我正在使用 Red Gate SQL Compare 根据 SVN 和数据库之间的差异创建发布脚本。这导致脚本包含一堆表和过程更改,并且工作正常。然而,有一件事让我感到困惑,它使用了可序列化的事务隔离级别。
我知道它对 dml 语句的作用,但我不确定它对 ddl 意味着什么。有人可以启发我,也许举个例子吗?
我们正在使用动态 SQL 运行以下查询,当我们运行并发实例时,它会在少数情况下出错。错误是:
由于数据移动,无法使用 NOLOCK 继续扫描...
这个问题说当一个进程读取另一个进程正在删除的数据时会抛出这个错误。我们的过程是删除和读取相同的行,但是按照以下查询一个接一个地读取(在SELECT之后DELETE):
DELETE FROM Table1
WHERE colum1 = somevalue1
AND column2 = somevalue2
SELECT COUNT(*)
FROM Table1 WITH (NOLOCK)
WHERE colum1 = somevalue1
AND column2 = somevalue2
Run Code Online (Sandbox Code Playgroud)
我试图了解上述查询的执行。由于SELECT未提交,它是否在提交之前开始执行DELETE?这是否意味着删除NOLOCK提示会停止错误?
我正在尝试在测试环境中对 MySQL 的隔离级别进行一些试验。
我执行以下操作:
mysql> set @@session.tx_isolation='READ-UNCOMMITED';
ERROR 1231 (42000): Variable 'tx_isolation' can't be set to the value of 'READ-UNCOMMITED'
Run Code Online (Sandbox Code Playgroud)
这也失败了:
mysql> update information_schema.session_variables set variable_value='READ-UNCOMMITED' where variable_name='TX_ISOLATION';
ERROR 1044 (42000): Access denied for user 'root'@'localhost' to database 'information_schema'
Run Code Online (Sandbox Code Playgroud)
我在这里做错了什么?我是根。所以它不应该是一个权利问题。
我运行了以下查询:
SELECT session_id,CASE transaction_isolation_level
WHEN 0 THEN 'Unspecified'
WHEN 1 THEN 'ReadUncommitted'
WHEN 2 THEN 'ReadCommitted'
WHEN 3 THEN 'Repeatable'
WHEN 4 THEN 'Serializable'
WHEN 5 THEN 'Snapshot' END AS TRANSACTION_ISOLATION_LEVEL
FROM sys.dm_exec_sessions
Where transaction_isolation_level = 4
Run Code Online (Sandbox Code Playgroud)
进而:
DBCC INPUTBUFFER(157)
Run Code Online (Sandbox Code Playgroud)
其中 157 是先前的 session_id 之一,以查看查询编号之一的结果的语句。1.
它显示了以下内容:
(@ID uniqueidentifier) SELECT * FROM PS WITH (NOLOCK) WHERE ID = @ID
如何使用WITH (NOLOCK)隔离级别 Serializable 运行语句?有什么“覆盖”的With (NOLOCK)吗?
使用 PostgreSQL 9.5 我想确保当我运行一个SELECT语句时我得到一致的结果,即如果表在SELECT运行时被修改,我想获得SELECT启动时有效的状态。
基本上,它就像:拍摄一张表的快照,并且在拍摄快照时不允许更新表,然后交付快照,同时再次允许更新。
如果我正确理解隔离级别,REPEATABLE READ这就是我要找的,不是吗?
现在我的问题是:如何SELECT使用REPEATABLE READ隔离级别运行?或者我错过了什么,我的方法是错误的?我将如何解决这个问题?
postgresql select isolation-level snapshot-isolation postgresql-9.5
在 SQL Server 2012 实例上托管的数据库上,我已启用ALLOW_SNAPSHOT_ISOLATION并验证状态为ON使用
SELECT snapshot_isolation_state_desc,name from sys.databases
但是,在 2 个单独的会话中,如果我TABLOCK在第一个和UPDATE第二个中运行长时间运行的选择(反之亦然),无论哪个查询首先开始都会阻止第二个查询(根据sp_who2)
看着
select * from sys.dm_exec_requests , 两个查询的事务隔离级别都是已提交读 (2)
根据我的理解,启用快照隔离后,tempdb 的使用率应该会增加,但在这种情况下不应发生阻塞。我是否缺少一些配置步骤来实现这种行为?
问题是关于 MySQL InnoDB 表中同时 SELECT 和 UPDATE 的行为:
我们有一个相对较大的表,我们定期扫描读取多个字段,包括名为 LastUpdate 的字段。在扫描期间,我们更新先前扫描的行。更新在后台线程中批处理和执行 - 使用不同的连接。需要注意的是,我们更新已读取的行。
三个问题:
SELECT它仍在进行中?READ-UNCOMMITTED用于SELECT帮助吗?isolation-level ×10
mysql ×4
sql-server ×4
innodb ×3
postgresql ×3
nolock ×2
transaction ×2
blocking ×1
concurrency ×1
ddl ×1
deadlock ×1
locking ×1
select ×1