首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >InnoDB交易原理

InnoDB交易原理
EN

Stack Overflow用户
提问于 2017-04-06 07:47:34
回答 2查看 136关注 0票数 0

抱歉,如果这是个愚蠢的问题。我有MySQL InnoDB应用程序和70+表,并使用事务。除了一件事(表)外,一切都很好:

代码语言:javascript
复制
CREATE TABLE IF NOT EXISTS `mag_pj_art_sums` (
`id` int(11) NOT NULL,  (primary key)
`id_pj` int(11) NOT NULL,   (index)
`id_artikal` int(11) NOT NULL,  (index)
`kol_stanje_knjig` decimal(18,2) DEFAULT NULL)

对于所有查询,我都使用相同的原则:

代码语言:javascript
复制
START TRANSACTION (query('set autocommit=0;'); query('START TRANSACTION;');)
SELECT … FROM table WHERE …
UPDATE TABLE SET …. WHERE ….
COMIT

在所有表中,主键用于选择和更新(在下面的查询模式中)。

除了mag_pj_art_sums,我在其中使用:

代码语言:javascript
复制
SELECT … FROM mag_pj_art_sums WHERE (id_artikal='$id_artikal' AND id_pj='$id_pj')

代码语言:javascript
复制
UPDATE mag_pj_art_sums SET … WHERE (id_artikal='$id_artikal' AND id_pj='$id_pj')

在这种情况下,这些行是否可能没有被锁定?

因为,只有在这个表中,当有并发SELECT更新查询时,我才得到不一致的值.查询执行时没有错误,但值没有按应该更新的方式更新。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-04-06 10:07:33

不,他们没有锁上。当您没有更改事务隔离级别时,它仍然是REPEATABLE-READ的默认设置。

这意味着幻影读取是可能的。我在这个答案上写了一个简短的解释。

你应该做的是

代码语言:javascript
复制
START TRANSACTION;
SELECT … FROM table WHERE … FOR UPDATE;
UPDATE TABLE SET …. WHERE …;
COMMIT;

阅读更多关于SELECT ... FOR UPDATE 这里的信息。

票数 2
EN

Stack Overflow用户

发布于 2017-04-06 22:26:19

INDEX(id_artikal), INDEX(id_pj)INDEX(id_artikal, id_pj)不一样。添加后者;这两个查询都将运行得更快。

是的,FOR UPDATE是必需的。这必须添加到所有情况的START; SELECT...; UPDATE (same row)...; COMMIT。你可能有你没有注意到的错误!

我不担心tx_isolation

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43248880

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档