mysql - InnoDB事务原理

标签 mysql transactions innodb

抱歉,如果这是一个愚蠢的问题。 我有 MySQL InnoDB 应用程序,其中包含 70 多个表并使用事务。 除了一件事(表),一切都工作正常:

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)

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

START TRANSACTION (query('set autocommit=0;'); query('START TRANSACTION;');)
SELECT … FROM table WHERE …
UPDATE TABLE SET …. WHERE ….
COMIT

在所有表中,主键用于 SELECT 和 UPDATE(在下面的查询模式中)。

除了我使用的 mag_pj_art_sums:

SELECT … FROM mag_pj_art_sums WHERE (id_artikal='$id_artikal' AND id_pj='$id_pj')

UPDATE mag_pj_art_sums SET … WHERE (id_artikal='$id_artikal' AND id_pj='$id_pj')

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

因为,只有在这个表中,当存在并发 SELECT - UPDATE 查询时,我得到的值不一致。查询执行无误,但值未按应有的方式更新。

最佳答案

不,它们没有被锁定。当你没有改变事务隔离级别时,它仍然是默认的REPEATABLE-READ
这意味着幻读是可能的。我在 this answer 中写了一个简短的解释。 .

你应该做的是

START TRANSACTION;
SELECT … FROM table WHERE … FOR UPDATE;
UPDATE TABLE SET …. WHERE …;
COMMIT;

阅读更多关于 SELECT ... FOR UPDATE here .

关于mysql - InnoDB事务原理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43248880/

相关文章:

mysql - SQLYog:复制部分数据?

java - 我应该使用@Transactional 对JdbcTemplate 进行简单查询吗?

ruby-on-rails - 在 Ctrl+C 中断的情况下,如何在 Rake 任务中使用 ActiveRecord 事务进行回滚

postgresql - 为什么一个 Clojure JDBC 可序列化事务 "sees"(?) 由另一个事务进行更改?

mysql - 根据冲突条件查找行

mysql - 数据CRUD操作的理论基础

mysql - 在sql查询中连接属性

mysql - 如何在不影响生产性能的情况下向超过 10 GB 的 innodb mysql 表添加新列?

mysql - InnoDB 行操作的增加

mysql - 在 C 中追加或创建文件时如何请求连续 block (非碎片)?