|
Тема |
Re: прехвърляне на топката [re: Dakota] |
|
Автор |
salle (един такъв) |
|
Публикувано | 13.12.09 18:13 |
|
|
Ама ти съвсем се отнесе! В примера който ти давам няма DDL и е според всички дефиниции и в стандарта и в транзакциите по принцип!
Какво според теб трябва да направи сървъра след грешка и неявен ROLLBACK??
Какво друго очакваш да се случи освен да се започне нова транзакция??
Транзакция #1 e rollback-ната!
Няма я вече!
Не съществува!
Ти обаче въпреки, че транзакция #1 вече не съществува продължаваш да изпращаш следващи оператори!
Как по дяволите очакваш сървърът да да асоциира тези новоприети от него оператори с вече несъществуваща транзакция #1 при положение, че ти (клиентът) си му ги изпратил след като транзакия #1 е върната?
Тук въобще не става въпрос за MySQL!
По дефиниция при обработка на транцзакции във всеки момент SQL операторите се намират в контекста на транзакция.
При поредицата
BEGIN -- tx1
INSERT -- грешка
-- неявен ROLLBACK на tx1
INSERT -- този оператор задължително трябва да е част от транзакция
В този момент сървърът е абсолютно задължен да стартира нова транзакция и да изпълни този INSERT като част от нея!
SQL стандартът дефинира Transaction Initiating Statements като INSERT е един от тях. (Не само INSERT а всички DML и DDL оператори, но също така и SELECT. Общо взето почтги всички SQL оператори инициират нова транзакция ако няма активна такава)
Ако не вярваш погледни ето тук примерно:
15.2 In SQL-92, there was no explicit statements that starts a transaction as there is in SQL:1999 and in some database management systems. In SQL, you explicitly end a transaction by executing a COMMIT or ROLLBACK statement. Transactions are started implicitly whenever you execute a statement that needs the context of a transaction and no transaction is active. ... And of course, you can explicitly start a transaction using SQL:1999 START TRANSACTION statement ...
|
| |
|
|
|