InnoDB交易原则

时间:2017-04-06 07:47:35

标签: 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

在所有表中,PRIMARY键用于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查询时,我得到了不一致的值。执行查询时没有错误,但值不会按原样更新。

2 个答案:

答案 0 :(得分:2)

不,他们没有上锁。如果您尚未更改事务隔离级别,则它仍然是val df = spark.read.csv(path) df.select(df.columns.map(col(_).cast("integer")): _*) 的默认值 这意味着可以进行幻像读取。我在this answer中写了一个简短的解释。

你应该做的是

REPEATABLE-READ

详细了解START TRANSACTION; SELECT … FROM table WHERE … FOR UPDATE; UPDATE TABLE SET …. WHERE …; COMMIT; here

答案 1 :(得分:1)

INDEX(id_artikal), INDEX(id_pj) INDEX(id_artikal, id_pj)相同。加上后者;两个查询都会运行得更快。

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

我不担心tx_isolation