Надёжность транзакций, спорные ситуации.

 
0
 
MySQL
ava
animegirl | 23.03.2013, 07:27
Как я уже выяснила, у транзакций нету проблем, с авто инкрементом, счётчик накручивает вне зависимости от того, вставили в итоге значения или нет, это всё хорошо сделано. Я немного запуталась с дубликатами. Вот текст из мануала:
Цитата


INSERT sets an exclusive lock on the inserted row. This lock is an index-record lock, not a next-key lock (that is, there is no gap lock) and does not prevent other sessions from inserting into the gap before the inserted row. 


  Prior to inserting the row, a type of gap lock called an insertion intention gap lock is set. This lock signals the intent to insert in such a way that multiple transactions inserting into the same index gap need not wait for each other if they are not inserting at the same position within the gap. Suppose that there are index records with values of 4 and 7. Separate transactions that attempt to insert values of 5 and 6 each lock the gap between 4 and 7 with insert intention locks prior to obtaining the exclusive lock on the inserted row, but do not block each other because the rows are nonconflicting. 


  If a duplicate-key error occurs, a shared lock on the duplicate index record is set. This use of a shared lock can result in deadlock should there be multiple sessions trying to insert the same row if another session already has an exclusive lock. This can occur if another session deletes the row. Suppose that an InnoDB table t1 has the following structure: 



CREATE TABLE t1 (i INT, PRIMARY KEY (i)) ENGINE = InnoDB;




  Now suppose that three sessions perform the following operations in order: 


  Session 1: 



START TRANSACTION;

INSERT INTO t1 VALUES(1);




  Session 2: 



START TRANSACTION;

INSERT INTO t1 VALUES(1);




  Session 3: 



START TRANSACTION;

INSERT INTO t1 VALUES(1);




  Session 1: 



ROLLBACK;




  The first operation by session 1 acquires an exclusive lock for the row. The operations by sessions 2 and 3 both result in a duplicate-key error and they both request a shared lock for the row. When session 1 rolls back, it releases its exclusive lock on the row and the queued shared lock requests for sessions 2 and 3 are granted. At this point, sessions 2 and 3 deadlock: Neither can acquire an exclusive lock for the row because of the shared lock held by the other. 


  A similar situation occurs if the table already contains a row with key value 1 and three sessions perform the following operations in order: 


  Session 1: 



START TRANSACTION;

DELETE FROM t1 WHERE i = 1;




  Session 2: 



START TRANSACTION;

INSERT INTO t1 VALUES(1);




  Session 3: 



START TRANSACTION;

INSERT INTO t1 VALUES(1);




  Session 1: 



COMMIT;




  The first operation by session 1 acquires an exclusive lock for the row. The operations by sessions 2 and 3 both result in a duplicate-key error and they both request a shared lock for the row. When session 1 commits, it releases its exclusive lock on the row and the queued shared lock requests for sessions 2 and 3 are granted. At this point, sessions 2 and 3 deadlock: Neither can acquire an exclusive lock for the row because of the shared lock held by the other.


1. я правильно поняла, что если одна транзакция начала вставку, то остальные ждут так или иначе?
2. я не совсем поняла, если первая транзакция делает откат (пример первый), то остальные всё равно обламываются, хотя место дубликата ещё не занято?
3. Во втором примере первая транзакция подтверждается, и связи со спорной ситуацией (как-то так перевела), транзакции 2 и 3 обе обламываются со вставкой, хотя вроде бы дубликата в самой таблице нету?
Kommentare (6)
ava
animegirl | 24.03.2013, 09:55 #
 smile 
ava
tzirechnoy | 25.03.2013, 09:14 #
Казалось бы, дело пяти минут -- проверить.
ava
Akina | 25.03.2013, 09:39 #
1) Да
2) И да, и нет.
3) И да, и нет.

По 2 и 3 - разберитесь, наконец, что такое deadlock...
ava
Zloxa | 25.03.2013, 11:01 #
animegirl, в обоих ситуациях кейса два и три облом идет по дедлоку(взаимной блокировки) а не по задвоенному значению индеска. Таки анализировать код ошибки да - надо. smile 
ava
animegirl | 26.03.2013, 09:01 #
Zloxa,
То есть... если там не будет третий одинаковой транзакции, то когда первая откат сделает, вторая пройдёт без проблем?
ava
Akina | 26.03.2013, 09:05 #
Если нет ничего, что мешает транзакции - само собой она пройдёт нормально...
Registrieren Sie sich oder melden Sie sich an, um schreiben zu können.
Unternehmen des Tages
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Mitwirkende
advanced
Absenden