START TRANSAKCJA wewnątrz kontekstu BEGIN… END lub składni zewnętrznej i LOOP

Mam dwa pytania dotyczące oświadczenia złożonego i transakcji w MySQL.

PIERWSZY:

Istnieją dwie uwagi w podręczniku MySQL:

Uwaga

We wszystkich zapisanych programach parser traktuje BEGIN [WORK] jako początek bloku BEGIN ... END. Aby rozpocząć transakcję w tym kontekście, użyj zamiast tego START TRANSACTION.

Uwaga

We wszystkich przechowywanych programach (procedury składowane i funkcje, wyzwalacze i zdarzenia) parser traktuje BEGIN [WORK] jako początek bloku BEGIN ... END. Rozpocznij transakcję w tym kontekście zamiast START TRANSACTION.

Nie mogę zrozumieć, co dokładnie oznacza. To znaczy, że muszę to zrobićSTART TRANSACTION zamiastBEGIN lub zaraz poBEGIN?

// 1st variant:

BEGIN
   START TRANSACTION
   COMMIT
END


// 2nd variant:

START TRANSACTION
COMMIT
END

Który jest właściwy, pierwszy wariant lub drugi wariant?

DRUGA:

Nie chcę tworzyć zapisanej procedury lub funkcji. Chcę po prostu utworzyć blok instrukcji złożonej z pętlą wewnątrz ogólnego przepływu, tak jak poniżej:

USE 'someDb';
START TRANSACTION
   ... create table statement
   ... insert statement

// now I want to implement some insert/select statements using loop, I do as follows:

DELIMITER $
BEGIN
  SET @n = 1, @m = 2;
  lab1: LOOP

   ... some insert, select statements here

   END LOOP lab1;
END $
DELIMITER ;

END

COMMIT

Czy to możliwe, że taka struktura? Ponieważ wystąpił błąd:

Query: BEGIN SET @n = 1, @m = 2; lab1: LOOP SELECT ...
Error Code: 1064
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SET @n = 1, @m = 2;
lab1: LOOP SELECT ...

Moje pytania to:

Czy wolno jej używaćBEGIN...END tylko w ogólnym przepływie bez tworzenia i używania procedur przechowywanych lub funkcji?

Czy wolno jej używaćBEGIN...END wnętrzeSTART TRANSACTION...COMMIT lub muszę to zrobićSTART TRANSACTION...COMMIT wnętrzeBEGIN...END?

BEGIN
   START TRANSACTION
   COMMIT
END

// vs.

START TRANSACTION
   BEGIN
   END
COMMIT

Czy muszę za wszelką cenę korzystaćBEGIN...END jeśli chcę używać tylkoLOOP? Mogę po prostu użyćLOOP składnia bez uruchamianiaBEGIN...END? Jedyny przykład w podręczniku dlaLOOP czy to jest:

  CREATE PROCEDURE doiterate(p1 INT)
     BEGIN
       label1: LOOP
         ... 

questionAnswers(1)

yourAnswerToTheQuestion