Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Firebird Π Π£ΠšΠžΠ’ΠžΠ”Π‘Π’Π’Πž Π ΠΠ—Π ΠΠ‘ΠžΠ’Π§Π˜ΠšΠ БАЗ ДАННЫΠ₯Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 120

Автор Π₯Π΅Π»Π΅Π½ Π‘ΠΎΡ€Ρ€ΠΈ

Π­Ρ‚Π° стратСгия Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ…ΠΎΡ€ΠΎΡˆΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² случаС Π΄Π²ΡƒΡ… условий, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ приводят ΠΊ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Π°ΠΌ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ.

* УсловиС 1: ΠΎΠ΄Π½Π° транзакция (наша транзакция) ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΠ»Π° Π½Π° сСрвСр ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ строки. Π’ это врСмя другая транзакция, ΡΡ‚Π°Ρ€Ρ‚ΠΎΠ²Π°Π²ΡˆΠ°Ρ Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ наша транзакция Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π»Π° эту строку, пытаСтся Π΅Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΈΠ»ΠΈ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ. Другая транзакция ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ ΠΈ ΠΈΠΌΠ΅Π΅Ρ‚ Π΄Π²Π° Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° Π²Ρ‹Π±ΠΎΡ€Π°:

β€’ ΠΎΠ½Π° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡ‚ΠΌΠ΅Π½ΠΈΡ‚ΡŒ свою ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΡƒ ΠΈ ΠΏΠΎΠ·ΠΆΠ΅ снова ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΠΈΡ‚ΡŒ Π΅Π΅ для вновь ΠΏΠΎΠ΄Ρ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½Π½ΠΎΠΉ вСрсии строки;

β€’ ΠΎΠ½Π° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΆΠ΄Π°Ρ‚ΡŒ, ΠΏΠΎΠΊΠ° наша транзакция Π»ΠΈΠ±ΠΎ ΠΏΠΎΠ΄Ρ‚Π²Π΅Ρ€Π΄ΠΈΡ‚, Π»ΠΈΠ±ΠΎ ΠΎΡ‚ΠΌΠ΅Π½ΠΈΡ‚ свою Ρ€Π°Π±ΠΎΡ‚Ρƒ.

* УсловиС 2: наша транзакция Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅Ρ‚ для записи Ρ†Π΅Π»ΡƒΡŽ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ, Ссли ΠΈΠΌΠ΅Π΅Ρ‚ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ изоляции для Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ SNAPSHOT TABLE STABILITY ΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ PROTECTED, Π° другая транзакция пытаСтся ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΈΠ»ΠΈ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ строку ΠΈΠ»ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π½ΠΎΠ²ΡƒΡŽ строку.

ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ наша транзакция посылаСт ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ строки. ΠŸΠΎΡΠ²Π»ΡΠ΅Ρ‚ΡΡ другая транзакция ΠΈ Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ Ρ‚ΠΎΠΉ ΠΆΠ΅ строки. ΠŸΡ€ΠΈ ΡƒΡ€ΠΎΠ²Π½Π΅ изоляции SNAPSHOT ΠΈ Ρ€Π΅ΠΆΠΈΠΌΠ΅ WAIT другая транзакция Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒ, ΠΏΠΎΠΊΠ° наша транзакция Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ свою Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΏΡƒΡ‚Π΅ΠΌ подтвСрТдСния ΠΈΠ»ΠΈ ΠΎΡ‚ΠΊΠ°Ρ‚Π°.

Если наша транзакция ΠΏΠΎΠ΄Ρ‚Π²Π΅Ρ€ΠΆΠ΄Π°Π΅Ρ‚ измСнСния, Ρ‚ΠΎ другая транзакция ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ ΠΎΡ‚ΠΊΠ°Π· ΠΏΠΎ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Ρƒ измСнСния. ΠšΠ»ΠΈΠ΅Π½Ρ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ запустил Π΄Ρ€ΡƒΠ³ΡƒΡŽ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ, Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π»ΠΈΠ±ΠΎ ΠΎΡ‚ΠΊΠ°Ρ‚ΠΈΡ‚ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ ΠΈ Π·Π°Π½ΠΎΠ²ΠΎ Π΅Π΅ запустит для ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠΉ Π²Ρ‹Π΄Π°Ρ‡ΠΈ запроса, Π»ΠΈΠ±ΠΎ просто ΠΏΠΎΠ΄Ρ‚Π²Π΅Ρ€Π΄ΠΈΡ‚ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ.

Π’Ρ‹Π·ΠΎΠ² COMMIT Π² ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Π° Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Π½Π΅ рСкомСндуСтся, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ Ρ€Π°Π·Ρ€ΡƒΡˆΠ°Π΅Ρ‚ Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½ΠΎΡΡ‚ΡŒ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ - нСкоторая Ρ€Π°Π±ΠΎΡ‚Π° Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π°, нСкоторая Π½Π΅Ρ‚, ΠΈ впослСдствии Π±ΡƒΠ΄Π΅Ρ‚ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€Π΅Π΄ΡΠΊΠ°Π·Π°Ρ‚ΡŒ состояниС Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…[97].

К соТалСнию, Firebird ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚Π΅Π½Π΄Π΅Π½Ρ†ΠΈΡŽ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΡ‚ΡŒ всС ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ ΠΈ сообщаСт ΠΎ Π½ΠΈΡ… ΠΊΠ°ΠΊ "deadlock" (взаимная Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ°). ΠΠΎΡ€ΠΌΠ°Π»ΡŒΠ½Ρ‹Π΅ случаи, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±Ρ‹Π»ΠΈ описаны, Π½Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π²Π·Π°ΠΈΠΌΠ½ΠΎΠΉ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΎΠΉ.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ взаимная Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ°?

Взаимная Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° являСтся просто сокращСнным Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ, заимствованным ΠΈΠ· рСслинга, для условия, ΠΊΠΎΠ³Π΄Π° Π΄Π²Π΅ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ Π±ΠΎΡ€ΡŽΡ‚ΡΡ Π·Π° ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ строк Π² ΠΏΠ΅Ρ€Π΅ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰ΠΈΡ…ΡΡ Π½Π°Π±ΠΎΡ€Π°Ρ… ΠΈ Π½ΠΈ ΠΎΠ΄Π½Π° транзакция Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π° ΠΏΠ΅Ρ€Π΅Π΄ Π΄Ρ€ΡƒΠ³ΠΎΠΉ.

НапримСр, наша транзакция ΠΈΠΌΠ΅Π΅Ρ‚ измСнСния, ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΠ΅ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ, для строки x ΠΈ собираСтся ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ строку Y Π² Ρ‚ΠΎ врСмя, ΠΊΠ°ΠΊ другая транзакция ΠΈΠΌΠ΅Π΅Ρ‚ измСнСния, ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΠ΅ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ, для строки Y ΠΈ собираСтся ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ строку x, ΠΈ ΠΎΠ±Π΅ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ ΠΈΠΌΠ΅ΡŽΡ‚ Ρ€Π΅ΠΆΠΈΠΌ WAIT. Как ΠΈ Π² рСслингС, взаимная Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½Π°, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ссли ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π±ΠΎΡ€Ρ†ΠΎΠ² Π½Π΅ ΡƒΠ΄Π΅Ρ€ΠΆΠΈΡ‚ Ρ€ΡƒΠΊΡƒ. Одна транзакция Π΄ΠΎΠ»ΠΆΠ½Π° Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΎΡ‚ΠΊΠ°Ρ‚, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΠΎΠ΄Ρ‚Π²Π΅Ρ€Π΄ΠΈΡ‚ΡŒ свои измСнСния.

Firebird прСдоставляСт прилоТСниям срСдство Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π²Π·Π°ΠΈΠΌΠ½ΠΎΠΉ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ ΠΏΡƒΡ‚Π΅ΠΌ сканирования Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ ΠΊΠ°ΠΆΠ΄Ρ‹Π΅ нСсколько сСкунд. Он ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎ Π²Ρ‹Π±Π΅Ρ€Π΅Ρ‚ ΠΎΠ΄Π½Ρƒ ΠΈΠ· Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ -Π²Π·Π°ΠΈΠΌΠ½ΠΎΠΉ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ ΠΈ выдаст для Π½Π΅Π΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π²Π·Π°ΠΈΠΌΠ½ΠΎΠΉ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ.

Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±ΠΎΡΡ‚ΡŒΡΡ сообщСний ΠΎ Π²Π·Π°ΠΈΠΌΠ½ΠΎΠΉ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ΅. Наоборот, ΠΈΠΌΠ΅Π΅Ρ‚ смысл ΠΈΠ·ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΌΠ½ΠΎΠ³ΠΈΡ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ Π² контСкстах Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ. Π’Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π΄ΠΎΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ Π²Π·Π°ΠΈΠΌΠ½Ρ‹Ρ… Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ ΠΈ эффСктивно ΠΈΡ… ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ Π² вашСм ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ.

Если наша транзакция Π²Ρ‹Π±Ρ€Π°Π½Π° для Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π²Π·Π°ΠΈΠΌΠ½ΠΎΠΉ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ, ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΎΡ‚ΠΊΠ°Ρ‚ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠΉ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ Π²ΠΎΠ·ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒ свою Ρ€Π°Π±ΠΎΡ‚Ρƒ. ΠΠ»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π° - ΠΏΠΎΠ΄Ρ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ΠΈΠ΅ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ Π² ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ - Π½Π΅ рСкомСндуСтся, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ наша транзакция станСт Π½Π΅Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½ΠΎΠΉ, Π° другая транзакция даст сбой ΠΏΠΎ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Ρƒ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ.


Вупиковая ситуация

Π’ Ρ€Π΅Π΄ΠΊΠΈΡ… случаях Π±ΠΎΠ»Π΅Π΅ Π΄Π²ΡƒΡ… Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΎ Π²ΠΎ Π²Π·Π°ΠΈΠΌΠ½ΡƒΡŽ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ ΠΏΡ€ΠΈ Π±ΠΎΡ€ΡŒΠ±Π΅ Π·Π° ΠΏΠ΅Ρ€Π΅ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰ΠΈΠ΅ΡΡ Π½Π°Π±ΠΎΡ€Ρ‹. Иногда это называСтся Ρ‚ΡƒΠΏΠΈΠΊΠΎΠ²ΠΎΠΉ ситуациСй (программистский ΠΆΠ°Ρ€Π³ΠΎΠ½ - deadly embrace, ΡΠΌΠ΅Ρ€Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΎΠ±ΡŠΡΡ‚ΠΈΡ). Π‘ΠΊΠ°Π½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ Π²Ρ‹Π±Π΅Ρ€Π΅Ρ‚ ΠΎΠ΄Π½Ρƒ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ (Π½Π°ΡˆΡƒ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ), ситуация Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Π° Π² клиСнтском ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ, ΠΊΠ°ΠΊ Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅. ΠŸΡ€ΠΈ этом Π΄Π°ΠΆΠ΅ Ссли ΠΊΠ»ΠΈΠ΅Π½Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ ΠΎΡ‚ΠΊΠ°Ρ‚ нашСй Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ, Ρ‚Π΅ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ всС Π΅Ρ‰Π΅ останутся Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ.


Активный Ρ‚ΡƒΠΏΠΈΠΊ

ΠšΠ»ΠΈΠ΅Π½Ρ‚ ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Π½ΠΎΠ²ΡƒΡŽ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ ΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΠΈΡ‚ΡŒ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΡƒ, ΠΎΠ΄Π½Π°ΠΊΠΎ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ сопСрники всС Π΅Ρ‰Π΅ находятся Π² состоянии Π²Π·Π°ΠΈΠΌΠ½ΠΎΠΉ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ, оТидая ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ сканирования Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ для освобоТдСния ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ сопСрника с Π²Ρ‹Π΄Π°Ρ‡Π΅ΠΉ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ. Если ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ повторяСт ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΡƒ с Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠ΅ΠΉ WAIT, ΠΎΠ½ просто ΠΆΠ΄Π΅Ρ‚ бСсконСчноС врСмя, ΠΊΠΎΠ³Π΄Π° Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½Π° тупиковая ситуация с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ транзакциями. ΠŸΡ€ΠΎ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ с Ρ‚Π°ΠΊΠΈΠΌΠΈ Ρ‚Ρ‰Π΅Ρ‚Π½Ρ‹ΠΌΠΈ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ°ΠΌΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π° говорят, Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° находится Π² Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΌ Ρ‚ΡƒΠΏΠΈΠΊΠ΅.

ΠšΠΎΡ€ΠΎΡ‡Π΅ говоря, Π²Π°ΠΆΠ½ΠΎ Π² ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ контСксты Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ привСсти ΠΊ Ρ‚ΡƒΠΏΠΈΠΊΠΎΠ²ΠΎΠΉ ситуации. Π’ качСствС Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ Π·Π°Ρ‰ΠΈΡ‚Ρ‹ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ способны быстро ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ ΠΈ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ½Ρ‹Π΅ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π»ΠΈΡΡŒ чисто ΠΈ Π±Π΅Π· Π·Π°Π΄Π΅Ρ€ΠΆΠ΅ΠΊ.


ΠŸΠΎΡ€Π° дальшС

Π”Π°Π»Π΅Π΅ ΠΌΡ‹ рассмотрим Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° клиСнтских ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ. Π’Π΅ΠΌΡ‹ Π² этой Π³Π»Π°Π²Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π½Π΅ΠΉΡ‚Ρ€Π°Π»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΊ Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰ΠΈΠΌ языкам. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ всС соврСмСнныС срСдства Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΈ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Ρ‹ для Firebird ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ API Π² Ρ‚ΠΎΠΉ ΠΈΠ»ΠΈ ΠΈΠ½ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΠ΅, Ρ‡Ρ‚ΠΎ Ρ…ΠΎΡ€ΠΎΡˆΠΎ для ΠΎΠ΄Π½ΠΎΠ³ΠΎ, Ρ…ΠΎΡ€ΠΎΡˆΠΎ ΠΈ для Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ.

ГЛАВА 27. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ с транзакциями.

Вранзакция являСтся Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ для всСх взаимодСйствий клиСнтского прилоТСния с сСрвСром. Π’ этой Π³Π»Π°Π²Π΅ ΠΌΡ‹ с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… интСрфСйсов ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° рассмотрим запуск, ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ.

МногиС языки ΠΈ срСдства Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈΠΌΠ΅ΡŽΡ‚ интСрфСйс с Firebird. ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΠ΅ описаниС управлСния транзакциями Firebird Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΈΠ· Π½ΠΈΡ… находится Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Π°ΠΌΠΈ Π΄Π°Π½Π½ΠΎΠΉ ΠΊΠ½ΠΈΠ³ΠΈ.

Π―Π·Ρ‹ΠΊ для Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ

Π’Π°ΠΆΠ½ΠΎ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ ΠΊ срСдствам Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ Π² Firebird. Π”ΠΎ сих ΠΏΠΎΡ€ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ связанныС с транзакциями особСнности вовсС Π½Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ Π² динамичСском SQL, Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Π΅Ρ€Π΅Π· API. Π‘Ρ€Π΅Π΄ΠΈ нСбольшого количСства связанных с транзакциями ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² SQL ΠΈ доступных Π² подмноТСствС DSQL Ρ‚ΠΎΠ»ΡŒΠΊΠΎ COMMIT ΠΈ ROLLBACK доступны Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ интСрфСйсС. Π’ ΠΊΠ½ΠΈΠ³Π΅ осознанно Π²Ρ‹Π±Ρ€Π°Π½ Π½Π΅ΠΉΡ‚Ρ€Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΊ языкам срСдств Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ. Основной Π°ΠΊΡ†Π΅Π½Ρ‚ дСлаСтся Π½Π° динамичСский SQL, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ Π² Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… срСдств Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ клиСнтских ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ. Π’ Π³Π»Π°Π²Π΅ прСдставлСны Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹, ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎ Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΈ для Π°Π²Ρ‚ΠΎΡ€Π°, ΠΈ для читатСля.

Π₯отя эта Π³Π»Π°Π²Π° Π½Π΅ описываСт ESQL[98] ΠΈΠ»ΠΈ API[99], ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Ρ€Π°Π·Π΄Π΅Π»Ρ‹ Π±ΡƒΠ΄ΡƒΡ‚ Ρ€Π°ΡΡΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΎ Π½ΠΈΡ… Π² Π±ΠΎΠ»Π΅Π΅ ΠΈΠ»ΠΈ ΠΌΠ΅Π½Π΅Π΅ ΠΎΠ±Ρ‰Π΅ΠΌ Π²ΠΈΠ΄Π΅ для получСния Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ понимания Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ пСрСдаСтся Ρ‡Π΅Ρ€Π΅Π· интСрфСйс, ΠΊΠΎΠ³Π΄Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρ‹ "Π±Π΅ΡΠ΅Π΄ΡƒΡŽΡ‚" с сСрвСрами ΠΎ транзакциях.

ESQL

НадмноТСство ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² SQL ΠΈ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ… SQL ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ², ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… Π² ΠΏΡ€Π΅ΠΆΠ½ΠΈΠ΅ Π²Ρ€Π΅ΠΌΠ΅Π½Π°, Π΄Π°ΠΆΠ΅ Π΄ΠΎ ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ API ΠΈ подмноТСства DSQL, прСдставляСт синтаксис стандарта SET TRANSACTION для конфигурирования ΠΈ старта Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ. Π’ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Ρ„ΠΎΡ€ΠΌΠ°Ρ… ΠΎΠ½ доступСн Π² DSQL ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ использован Π² ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π΅ isql. Π­Ρ‚ΠΎ ΡƒΠ΄ΠΎΠ±Π½ΠΎΠ΅ срСдство ΠΎΠ±Ρ‰Π΅ΠΉ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ API ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ ΡΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½Ρ‚Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ[100].

API

API прСдоставляСт Π³ΠΈΠ±ΠΊΠΈΠΉ интСрфСйс мноТСства слоТных Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ программистам Π‘ ΠΈ C++ для создания клиСнтских ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ с Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ½ΠΊΠΈΠΌ ΡƒΡ€ΠΎΠ²Π½Π΅ΠΌ связи ΠΈ соСдинСния. Π“Ρ€ΡƒΠΏΠΏΠ° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ API Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ эквивалСнтныС ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ SQL, относящиСся ΠΊ транзакциям, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ isc_start_transaction() для ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° START TRANSACTION ΠΈ isc_commit_transaction() для ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° COMMIT.

Π—Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» API, ibase.h, ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏΡ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, опрСдСлСния Ρ‚ΠΈΠΏΠΎΠ² для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ структуры, опрСдСлСния ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΈ макросы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π² функциях. Он поставляСтся Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ Firebird /include.

Для Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… срСд Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ Object Pascal, Borland C++ Builder, Java, PHP, Python ΠΈ DBI::Perl классы ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΈΠ½ΠΊΠ°ΠΏΡΡƒΠ»ΠΈΡ€ΡƒΡŽΡ‚ Π²Ρ‹Π·ΠΎΠ²Ρ‹ API Firebird, относящиСся ΠΊ транзакциям. ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Ρ‹ для интСрфСйсов соСдинСния со стандартными Π±Π°Π·Π°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ… SQL - Π² особСнности ODBC, JDBC ΠΈ .NET- ΠΏΠΎΡ…ΠΎΠΆΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ API[101].

Запуск Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ

SQL

ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ SQL для запуска Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ ΠΈΠΌΠ΅Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ синтаксис:


SET TRANSACTION [NAME <имя-Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ>]

[READ WRITE | READ ONLY] /* Ρ€Π΅ΠΆΠΈΠΌ доступа */

[WAIT | NO WAIT] /* Ρ€Π΅ΠΆΠΈΠΌ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ */

[ISOLATION LEVEL] /* ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ изоляции */

{SNAPSHOT [TABLE STABILITY] | READ COMMITTED [[NO] RECORD VERSION]}

[RESERVING <ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅-рСзСрвирования>

| USING <дСскриптор-Π±Π°Π·Ρ‹-Π΄Π°Π½Π½Ρ‹Ρ…> [,дСскриптор-Π±Π°Π·Ρ‹-Π΄Π°Π½Π½Ρ‹Ρ…...]];


ЀинальноС ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ RESERVING Π·Π°Π΄Π°Π΅Ρ‚ Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‚Π°Π±Π»ΠΈΡ†, ΠΎΠ±ΡΡƒΠΆΠ΄Π°Π²ΡˆΠ΅Π΅ΡΡ Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ Π³Π»Π°Π²Π΅. Π•Π³ΠΎ синтаксис прСдставляСтся Π² Π²ΠΈΠ΄Π΅:

<ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅-рСзСрвирования> : := <Ρ‚Π°Π±Π»ΠΈΡ†Π°> [, <Ρ‚Π°&Π»ΠΈΡ†Π°> ...] [FOR [SHARED | PROTECTED] {READ | WRITE}]

[, <ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅-рСзСрвирования> [, <ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅-рСзСрвирования> ...]]


! ! !