13.2. ÐзолÑÑÐ¸Ñ ÑÑанзакÑий
СÑандаÑÑ SQL опÑеделÑÐµÑ ÑеÑÑÑе ÑÑÐ¾Ð²Ð½Ñ Ð¸Ð·Ð¾Ð»ÑÑии ÑÑанзакÑий. Ðаиболее ÑÑÑогий из Ð½Ð¸Ñ â ÑеÑиализÑемÑй, опÑеделÑеÑÑÑ Ð¾Ð´Ð½Ð¸Ð¼ абзаÑем, говоÑÑÑем, ÑÑо пÑи паÑаллелÑном вÑполнении неÑколÑко ÑеÑиализÑемÑÑ ÑÑанзакÑий Ð´Ð¾Ð»Ð¶Ð½Ñ Ð³Ð°ÑанÑиÑованно вÑдаваÑÑ Ñакой же ÑезÑлÑÑаÑ, как еÑли Ð±Ñ Ð¾Ð½Ð¸ запÑÑкалиÑÑ Ð¿Ð¾ оÑеÑеди в некоÑоÑом поÑÑдке. ÐÑÑалÑнÑе ÑÑи ÑÑÐ¾Ð²Ð½Ñ Ð¾Ð¿ÑеделÑÑÑÑÑ ÑеÑез опиÑÐ°Ð½Ð¸Ñ Ð¾ÑобÑÑ Ñвлений, коÑоÑÑе Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ñ Ð¿Ñи взаимодейÑÑвии паÑаллелÑнÑÑ ÑÑанзакÑий, но не допÑÑкаÑÑÑÑ Ð½Ð° опÑеделÑнном ÑÑовне. Ðак оÑмеÑаеÑÑÑ Ð² ÑÑандаÑÑе, из опÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ ÑеÑиализÑемого ÑÑÐ¾Ð²Ð½Ñ Ð²ÑÑекаеÑ, ÑÑо на ÑÑом ÑÑовне ни одно из ÑÑÐ¸Ñ Ñвлений не возможно. (Ð Ñамом деле â еÑли ÑÑÑÐµÐºÑ ÑÑанзакÑий должен бÑÑÑ Ñем же, ÑÑо и пÑи Ð¸Ñ Ð²Ñполнении по оÑеÑеди, как можно бÑло Ð±Ñ ÑвидеÑÑ Ð¾ÑобÑе ÑвлениÑ, ÑвÑзаннÑе Ñ Ð´ÑÑгими ÑÑанзакÑиÑми?)
СÑандаÑÑ Ð¾Ð¿Ð¸ÑÑÐ²Ð°ÐµÑ ÑледÑÑÑие оÑобÑе ÑÑловиÑ, недопÑÑÑимÑе Ð´Ð»Ñ ÑазлиÑнÑÑ ÑÑовней изолÑÑии:
- «гÑÑзное» ÑÑение
ТÑанзакÑÐ¸Ñ ÑиÑÐ°ÐµÑ Ð´Ð°Ð½Ð½Ñе, запиÑаннÑе паÑаллелÑной незавеÑÑÑнной ÑÑанзакÑией.
- неповÑоÑÑемое ÑÑение
ТÑанзакÑÐ¸Ñ Ð¿Ð¾Ð²ÑоÑно ÑиÑÐ°ÐµÑ Ñе же даннÑе, ÑÑо и ÑанÑÑе, и обнаÑÑживаеÑ, ÑÑо они бÑли Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ñ Ð´ÑÑгой ÑÑанзакÑией (коÑоÑÐ°Ñ Ð·Ð°Ð²ÐµÑÑилаÑÑ Ð¿Ð¾Ñле пеÑвого ÑÑениÑ).
- ÑанÑомное ÑÑение
ТÑанзакÑÐ¸Ñ Ð¿Ð¾Ð²ÑоÑно вÑполнÑÐµÑ Ð·Ð°Ð¿ÑоÑ, возвÑаÑаÑÑий Ð½Ð°Ð±Ð¾Ñ ÑÑÑок Ð´Ð»Ñ Ð½ÐµÐºÐ¾ÑоÑого ÑÑловиÑ, и обнаÑÑживаеÑ, ÑÑо Ð½Ð°Ð±Ð¾Ñ ÑÑÑок, ÑдовлеÑвоÑÑÑÑÐ¸Ñ ÑÑловиÑ, изменилÑÑ Ð¸Ð·-за ÑÑанзакÑии, завеÑÑивÑейÑÑ Ð·Ð° ÑÑо вÑемÑ.
- Ð°Ð½Ð¾Ð¼Ð°Ð»Ð¸Ñ ÑеÑиализаÑии
РезÑлÑÑÐ°Ñ ÑÑпеÑной ÑикÑаÑии гÑÑÐ¿Ð¿Ñ ÑÑанзакÑий оказÑваеÑÑÑ Ð½ÐµÑоглаÑованнÑм пÑи вÑевозможнÑÑ Ð²Ð°ÑианÑÐ°Ñ Ð¸ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÑÑÐ¸Ñ ÑÑанзакÑий по оÑеÑеди.
УÑовни изолÑÑии ÑÑанзакÑий, опиÑаннÑе в ÑÑандаÑÑе SQL и ÑеализованнÑе в Postgres Pro, опиÑÑваÑÑÑÑ Ð² ТаблиÑе 13.1.
ТаблиÑа 13.1. УÑовни изолÑÑии ÑÑанзакÑий
| УÑÐ¾Ð²ÐµÐ½Ñ Ð¸Ð·Ð¾Ð»ÑÑии | «ÐÑÑзное» ÑÑение | ÐеповÑоÑÑемое ÑÑение | ФанÑомное ÑÑение | ÐÐ½Ð¾Ð¼Ð°Ð»Ð¸Ñ ÑеÑиализаÑии |
|---|---|---|---|---|
| Read uncommitted (ЧÑение незаÑикÑиÑованнÑÑ Ð´Ð°Ð½Ð½ÑÑ ) | ÐопÑÑкаеÑÑÑ, но не в PG | Ðозможно | Ðозможно | Ðозможно |
| Read committed (ЧÑение заÑикÑиÑованнÑÑ Ð´Ð°Ð½Ð½ÑÑ ) | Ðевозможно | Ðозможно | Ðозможно | Ðозможно |
| Repeatable read (ÐовÑоÑÑемое ÑÑение) | Ðевозможно | Ðевозможно | ÐопÑÑкаеÑÑÑ, но не в PG | Ðозможно |
| Serializable (СеÑиализÑемоÑÑÑ) | Ðевозможно | Ðевозможно | Ðевозможно | Ðевозможно |
Ð Postgres Pro Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе запÑоÑиÑÑ Ð»Ñбой из ÑеÑÑÑÑÑ ÑÑовней изолÑÑии ÑÑанзакÑий, однако внÑÑÑи ÑÐµÐ°Ð»Ð¸Ð·Ð¾Ð²Ð°Ð½Ñ ÑолÑко ÑÑи ÑазлиÑнÑÑ ÑÑовнÑ, Ñо еÑÑÑ Ñежим Read Uncommitted в Postgres Pro дейÑÑвÑÐµÑ ÐºÐ°Ðº Read Committed. ÐÑиÑина ÑÑого в Ñом, ÑÑо ÑолÑко Ñак можно ÑопоÑÑавиÑÑ ÑÑандаÑÑнÑе ÑÑовни изолÑÑии Ñ Ñеализованной в Postgres Pro аÑÑ Ð¸ÑекÑÑÑой многовеÑÑионного ÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ ÐºÐ¾Ð½ÐºÑÑенÑнÑм доÑÑÑпом.
Ð ÑÑой ÑаблиÑе Ñакже показано, ÑÑо ÑеализаÑÐ¸Ñ Repeatable Read в Postgres Pro не допÑÑÐºÐ°ÐµÑ ÑанÑомного ÑÑениÑ. ÐÑо ÑооÑвеÑÑÑвÑÐµÑ ÑÑандаÑÑÑ SQL, поÑколÑÐºÑ Ð¾Ð½ ÑÑÑанавливаеÑ, ÐºÐ°ÐºÐ¸Ñ Ð°Ð½Ð¾Ð¼Ð°Ð»Ð¸Ð¹ не должно бÑÑÑ Ð½Ð° опÑеделÑннÑÑ ÑÑовнÑÑ Ð¸Ð·Ð¾Ð»ÑÑии, но допÑÑÐºÐ°ÐµÑ Ð¸ более ÑÑÑогие огÑаниÑениÑ. Ðоведение имеÑÑÐ¸Ñ ÑÑ ÑÑовней изолÑÑии подÑобно опиÑÑваеÑÑÑ Ð² ÑледÑÑÑÐ¸Ñ Ð¿Ð¾Ð´ÑÐ°Ð·Ð´ÐµÐ»Ð°Ñ .
ÐÐ»Ñ Ð²ÑбоÑа нÑжного ÑÑÐ¾Ð²Ð½Ñ Ð¸Ð·Ð¾Ð»ÑÑии ÑÑанзакÑий иÑполÑзÑеÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð° SET TRANSACTION.
Ðажно
Ðоведение некоÑоÑÑÑ
ÑÑнкÑий и Ñипов даннÑÑ
Postgres Pro в ÑÑанзакÑиÑÑ
подÑинÑеÑÑÑ Ð¾ÑобÑм пÑавилам. Ð ÑаÑÑноÑÑи, Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¿Ð¾ÑледоваÑелÑноÑÑей (и ÑледоваÑелÑно, ÑÑÑÑÑика в ÑÑолбÑе, обÑÑÐ²Ð»ÐµÐ½Ð½Ð¾Ð¼Ñ ÐºÐ°Ðº serial) немедленно Ð²Ð¸Ð´Ð½Ñ Ð²Ð¾ вÑеÑ
оÑÑалÑнÑÑ
ÑÑанзакÑиÑÑ
и не оÑкаÑÑваÑÑÑÑ Ð½Ð°Ð·Ð°Ð´, еÑли вÑполнивÑÐ°Ñ Ð¸Ñ
ÑÑанзакÑÐ¸Ñ Ð¿ÑеÑÑваеÑÑÑ. См. Раздел 9.17 и ÐодÑаздел 8.1.4.
13.2.1. УÑÐ¾Ð²ÐµÐ½Ñ Ð¸Ð·Ð¾Ð»ÑÑии Read Committed
Read Committed â ÑÑÐ¾Ð²ÐµÐ½Ñ Ð¸Ð·Ð¾Ð»ÑÑии ÑÑанзакÑии, вÑбиÑаемÑй в Postgres Pro по ÑмолÑаниÑ. Ð ÑÑанзакÑии, ÑабоÑаÑÑей на ÑÑом ÑÑовне, запÑÐ¾Ñ SELECT (без пÑÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ FOR UPDATE/SHARE) Ð²Ð¸Ð´Ð¸Ñ ÑолÑко Ñе даннÑе, коÑоÑÑе бÑли заÑикÑиÑÐ¾Ð²Ð°Ð½Ñ Ð´Ð¾ наÑала запÑоÑа; он никогда не ÑÐ²Ð¸Ð´Ð¸Ñ Ð½ÐµÐ·Ð°ÑикÑиÑованнÑÑ
даннÑÑ
или изменений, внеÑÑннÑÑ
в пÑоÑеÑÑе вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿ÑоÑа паÑаллелÑнÑми ÑÑанзакÑиÑми. Ðо ÑÑÑи запÑÐ¾Ñ SELECT Ð²Ð¸Ð´Ð¸Ñ Ñнимок Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
в Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð½Ð°Ñала вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿ÑоÑа. Ðднако SELECT Ð²Ð¸Ð´Ð¸Ñ ÑезÑлÑÑаÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹, внеÑÑннÑÑ
Ñанее в ÑÑой же ÑÑанзакÑии, даже еÑли они еÑÑ Ð½Ðµ заÑикÑиÑованÑ. Также замеÑÑÑе, ÑÑо два поÑледоваÑелÑнÑÑ
опеÑаÑоÑа SELECT могÑÑ Ð²Ð¸Ð´ÐµÑÑ ÑазнÑе даннÑе даже в ÑамкаÑ
одной ÑÑанзакÑии, еÑли какие-Ñо дÑÑгие ÑÑанзакÑии заÑикÑиÑÑÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¿Ð¾Ñле запÑÑка пеÑвого SELECT, но до запÑÑка вÑоÑого.
ÐÐ¾Ð¼Ð°Ð½Ð´Ñ UPDATE, DELETE, SELECT FOR UPDATE и SELECT FOR SHARE ведÑÑ ÑÐµÐ±Ñ Ð¿Ð¾Ð´Ð¾Ð±Ð½Ð¾ SELECT пÑи поиÑке ÑелевÑÑ
ÑÑÑок: они найдÑÑ ÑолÑко Ñе ÑелевÑе ÑÑÑоки, коÑоÑÑе бÑли заÑикÑиÑÐ¾Ð²Ð°Ð½Ñ Ð½Ð° Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð½Ð°Ñала командÑ. Ðднако к моменÑÑ, когда они бÑдÑÑ Ð½Ð°Ð¹Ð´ÐµÐ½Ñ, ÑÑи ÑелевÑе ÑÑÑоки могÑÑ Ð±ÑÑÑ Ñже Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ñ (а Ñакже ÑÐ´Ð°Ð»ÐµÐ½Ñ Ð¸Ð»Ð¸ заблокиÑованÑ) дÑÑгой паÑаллелÑной ÑÑанзакÑией. Ð ÑÑом ÑлÑÑае запланиÑованное изменение бÑÐ´ÐµÑ Ð¾Ñложено до ÑикÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð»Ð¸ оÑкаÑа пеÑвой изменÑÑÑей даннÑе ÑÑанзакÑии (еÑли она еÑÑ Ð²ÑполнÑеÑÑÑ). ÐÑли пеÑÐ²Ð°Ñ Ð¸Ð·Ð¼ÐµÐ½ÑÑÑÐ°Ñ ÑÑанзакÑÐ¸Ñ Ð¾ÑкаÑÑваеÑÑÑ, ÐµÑ ÑезÑлÑÑÐ°Ñ Ð¾ÑбÑаÑÑваеÑÑÑ Ð¸ вÑоÑÐ°Ñ Ð¸Ð·Ð¼ÐµÐ½ÑÑÑÐ°Ñ ÑÑанзакÑÐ¸Ñ Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑодолжиÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ðµ изнаÑалÑно полÑÑенной ÑÑÑоки. ÐÑли пеÑÐ²Ð°Ñ ÑÑанзакÑÐ¸Ñ Ð·Ð°ÑикÑиÑовалаÑÑ, но в ÑезÑлÑÑаÑе Ñдалила ÑÑÑ ÑÑÑокÑ, вÑоÑÐ°Ñ Ð±ÑÐ´ÐµÑ Ð¸Ð³Ð½Ð¾ÑиÑоваÑÑ ÐµÑ, а в пÑоÑивном ÑлÑÑае попÑÑаеÑÑÑ Ð²ÑполниÑÑ ÑÐ²Ð¾Ñ Ð¾Ð¿ÐµÑаÑÐ¸Ñ Ñ Ð¸Ð·Ð¼ÐµÐ½Ñнной веÑÑией ÑÑÑоки. УÑловие поиÑка в команде (пÑедложение WHERE) вÑÑиÑлÑеÑÑÑ Ð¿Ð¾Ð²ÑоÑно Ð´Ð»Ñ Ð²ÑÑÑнениÑ, ÑооÑвеÑÑÑвÑÐµÑ Ð»Ð¸ по-пÑÐµÐ¶Ð½ÐµÐ¼Ñ ÑÑÐ¾Ð¼Ñ ÑÑÐ»Ð¾Ð²Ð¸Ñ Ð¸Ð·Ð¼ÐµÐ½ÑÐ½Ð½Ð°Ñ Ð²ÐµÑÑÐ¸Ñ ÑÑÑоки. ÐÑли да, вÑоÑÐ°Ñ Ð¸Ð·Ð¼ÐµÐ½ÑÑÑÐ°Ñ ÑÑанзакÑÐ¸Ñ Ð¿ÑодолжаÑÑ ÑÐ²Ð¾Ñ ÑабоÑÑ Ñ Ð¸Ð·Ð¼ÐµÐ½Ñнной веÑÑией ÑÑÑоки. ÐÑимениÑелÑно к командам SELECT FOR UPDATE и SELECT FOR SHARE ÑÑо ознаÑаеÑ, ÑÑо изменÑÐ½Ð½Ð°Ñ Ð²ÐµÑÑÐ¸Ñ ÑÑÑоки блокиÑÑеÑÑÑ Ð¸ возвÑаÑаеÑÑÑ ÐºÐ»Ð¸ÐµÐ½ÑÑ.
ÐоÑ
ожим обÑазом ведÑÑ ÑÐµÐ±Ñ INSERT Ñ Ð¿Ñедложением ON CONFLICT DO UPDATE. Ð Ñежиме Read Committed ÐºÐ°Ð¶Ð´Ð°Ñ ÑÑÑока, пÑÐµÐ´Ð»Ð°Ð³Ð°ÐµÐ¼Ð°Ñ Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ, бÑÐ´ÐµÑ Ð»Ð¸Ð±Ð¾ вÑÑавлена, либо изменена. ÐÑли не Ð²Ð¾Ð·Ð½Ð¸ÐºÐ½ÐµÑ Ð½ÐµÑвÑзаннÑÑ
оÑибок, гаÑанÑиÑÑеÑÑÑ Ð¾Ð´Ð¸Ð½ из ÑÑиÑ
двÑÑ
иÑÑ
одов. ÐÑли конÑÐ»Ð¸ÐºÑ Ð±ÑÐ´ÐµÑ Ð²Ñзван дÑÑгой ÑÑанзакÑией, ÑезÑлÑÑÐ°Ñ ÐºÐ¾ÑоÑой еÑÑ Ð½Ðµ видим Ð´Ð»Ñ INSERT, пÑедложение UPDATE подейÑÑвÑÐµÑ Ð½Ð° ÑÑÑ ÑÑÑокÑ, даже неÑмоÑÑÑ Ð½Ð° Ñо, ÑÑо ÑÑа команда обÑÑнÑм обÑазом Ð¼Ð¾Ð¶ÐµÑ Ð½Ðµ видеÑÑ Ð½Ð¸ÐºÐ°ÐºÑÑ Ð²ÐµÑÑÐ¸Ñ ÑÑой ÑÑÑоки.
ÐÑи вÑполнении INSERT Ñ Ð¿Ñедложением ON CONFLICT DO NOTHING ÑÑÑока Ð¼Ð¾Ð¶ÐµÑ Ð½Ðµ добавиÑÑÑÑ Ð² ÑезÑлÑÑаÑе дейÑÑÐ²Ð¸Ñ Ð´ÑÑгой ÑÑанзакÑии, ÑÑÑÐµÐºÑ ÐºÐ¾ÑоÑой не виден в Ñнимке ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ INSERT. ÐÑо опÑÑÑ Ð¶Ðµ Ð¸Ð¼ÐµÐµÑ Ð¼ÐµÑÑо ÑолÑко в Ñежиме Read Committed.
MERGE позволÑÐµÑ Ð¿Ð¾Ð»ÑзоваÑÐµÐ»Ñ ÑказаÑÑ ÑазлиÑнÑе комбинаÑии подкоманд INSERT, UPDATE и DELETE. Ðоманда MERGE Ñ Ð¿Ð¾Ð´ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°Ð¼Ð¸ INSERT и UPDATE ÑабоÑÐ°ÐµÑ Ð°Ð½Ð°Ð»Ð¾Ð³Ð¸Ñно INSERT Ñ ON CONFLICT DO UPDATE, но не гаÑанÑиÑÑеÑ, ÑÑо какаÑ-либо из команд INSERT или UPDATE бÑÐ´ÐµÑ Ð²Ñполнена. ÐÑли MERGE пÑÑаеÑÑÑ Ð²ÑполниÑÑ UPDATE или DELETE, и ÑÑÑока одновÑеменно изменÑеÑÑÑ, но ÑÑловие ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð¿Ð¾-пÑÐµÐ¶Ð½ÐµÐ¼Ñ Ð²ÑполнÑеÑÑÑ Ð´Ð»Ñ ÑекÑÑего Ñелевого и ÑекÑÑего иÑÑ
одного коÑÑежа, Ñо MERGE бÑÐ´ÐµÑ ÑабоÑаÑÑ Ñак же, как ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ UPDATE или DELETE, и вÑÐ¿Ð¾Ð»Ð½Ð¸Ñ Ñвои дейÑÑÐ²Ð¸Ñ Ñ Ð¸Ð·Ð¼ÐµÐ½Ñнной веÑÑией ÑÑÑоки. Ðднако поÑколÑÐºÑ Ð² MERGE могÑÑ ÑказÑваÑÑÑÑ Ð½ÐµÑколÑко дейÑÑвий, и они могÑÑ Ð±ÑÑÑ ÑÑловнÑми, ÑÑÐ»Ð¾Ð²Ð¸Ñ Ð´Ð»Ñ Ð²ÑеÑ
дейÑÑвий заново вÑÑиÑлÑÑÑÑÑ Ð´Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½Ñнной веÑÑии ÑÑÑоки, наÑÐ¸Ð½Ð°Ñ Ñ Ð¿ÐµÑвого дейÑÑвиÑ, даже еÑли дейÑÑвие, коÑоÑое пеÑвонаÑалÑно оказалоÑÑ Ð¿Ð¾Ð´Ñ
одÑÑим, идÑÑ Ð² ÑпиÑке дейÑÑвий позже. С дÑÑгой ÑÑоÑонÑ, еÑли ÑÑÑока одновÑеменно изменÑеÑÑÑ Ð¸Ð»Ð¸ ÑдалÑеÑÑÑ Ñак, ÑÑо ÑÑловие ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð½Ðµ вÑполнÑеÑÑÑ, MERGE бÑÐ´ÐµÑ Ð²ÑÑиÑлÑÑÑ ÑледÑÑÑие ÑÑÐ»Ð¾Ð²Ð¸Ñ Ð´ÐµÐ¹ÑÑвий NOT MATCHED и вÑÐ¿Ð¾Ð»Ð½Ð¸Ñ Ð´ÐµÐ¹ÑÑвие Ñ Ð¿ÐµÑвÑм подÑ
одÑÑим ÑÑловием. ÐÑли MERGE пÑÑаеÑÑÑ Ð²ÑполниÑÑ INSERT пÑи налиÑии ÑникалÑного индекÑа, и одновÑеменно добавлÑеÑÑÑ Ð¿Ð¾Ð²ÑоÑÑÑÑаÑÑÑ ÑÑÑока, Ð²Ð¾Ð·Ð½Ð¸ÐºÐ°ÐµÑ Ð¾Ñибка наÑÑÑÐµÐ½Ð¸Ñ ÑникалÑноÑÑи; MERGE не пÑÑаеÑÑÑ Ð¸Ð·Ð±ÐµÐ¶Ð°ÑÑ ÑакиÑ
оÑибок, заново вÑÑиÑлÑÑ ÑÑÐ»Ð¾Ð²Ð¸Ñ MATCHED.
ÐÑледÑÑвие опиÑаннÑÑ Ð²ÑÑе пÑавил, изменÑÑÑÐ°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð° Ð¼Ð¾Ð¶ÐµÑ ÑвидеÑÑ Ð½ÐµÑоглаÑованное ÑоÑÑоÑние: она Ð¼Ð¾Ð¶ÐµÑ Ð²Ð¸Ð´ÐµÑÑ ÑезÑлÑÑаÑÑ Ð¿Ð°ÑаллелÑнÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´, изменÑÑÑÐ¸Ñ Ñе же ÑÑÑоки, ÑÑо пÑÑаеÑÑÑ Ð¸Ð·Ð¼ÐµÐ½Ð¸ÑÑ Ð¾Ð½Ð°, но пÑи ÑÑом она не Ð²Ð¸Ð´Ð¸Ñ ÑезÑлÑÑаÑÑ ÑÑÐ¸Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´ в дÑÑÐ³Ð¸Ñ ÑÑÑÐ¾ÐºÐ°Ñ ÑаблиÑ. Ðз-за ÑÑого Ð¿Ð¾Ð²ÐµÐ´ÐµÐ½Ð¸Ñ ÑÑÐ¾Ð²ÐµÐ½Ñ Read Committed не Ð¿Ð¾Ð´Ñ Ð¾Ð´Ð¸Ñ Ð´Ð»Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´ Ñо ÑложнÑми ÑÑловиÑми поиÑка; однако он вполне пÑигоден Ð´Ð»Ñ Ð¿ÑоÑÑÑÑ ÑлÑÑаев. ÐапÑимеÑ, ÑаÑÑмоÑÑим изменение баланÑа ÑÑÑÑа в ÑÐ°ÐºÐ¸Ñ ÑÑанзакÑиÑÑ :
BEGIN; UPDATE accounts SET balance = balance + 100.00 WHERE acctnum = 12345; UPDATE accounts SET balance = balance - 100.00 WHERE acctnum = 7534; COMMIT;
ÐÑли две Ñакие ÑÑанзакÑии пÑÑаÑÑÑÑ Ð¿Ð°ÑаллелÑно измениÑÑ Ð±Ð°Ð»Ð°Ð½Ñ ÑÑÑÑа 12345, мÑ, еÑÑеÑÑвенно, Ñ Ð¾Ñим, ÑÑÐ¾Ð±Ñ Ð²ÑоÑÐ°Ñ ÑÑанзакÑÐ¸Ñ ÑабоÑала Ñ Ð¸Ð·Ð¼ÐµÐ½Ñнной веÑÑией ÑÑÑоки ÑÑÑÑа. Так как ÐºÐ°Ð¶Ð´Ð°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð° влиÑÐµÑ ÑолÑко на опÑеделÑннÑÑ ÑÑÑокÑ, еÑли она бÑÐ´ÐµÑ Ð²Ð¸Ð´ÐµÑÑ Ð¸Ð·Ð¼ÐµÐ½ÑннÑÑ Ð²ÐµÑÑÐ¸Ñ ÑÑÑоки, ÑÑо не пÑиведÑÑ Ðº пÑоблемам неÑоглаÑованноÑÑи.
Рболее ÑложнÑÑ
ÑиÑÑаÑиÑÑ
ÑÑÐ¾Ð²ÐµÐ½Ñ Read Committed Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑиводиÑÑ Ðº нежелаÑелÑнÑм ÑезÑлÑÑаÑам. ÐапÑимеÑ, ÑаÑÑмоÑÑим ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ DELETE, ÑабоÑаÑÑÑÑ Ñо ÑÑÑоками, коÑоÑÑе паÑаллелÑно добавлÑÐµÑ Ð¸ ÑдалÑÐµÑ Ð¸Ð· множеÑÑва, опÑеделÑнного ÐµÑ ÑÑловием, дÑÑÐ³Ð°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°. ÐапÑимеÑ, пÑедположим, ÑÑо website â ÑаблиÑа из двÑÑ
ÑÑÑок, в коÑоÑÑÑ
website.hits ÑÐ°Ð²Ð½Ñ 9 и 10:
BEGIN; UPDATE website SET hits = hits + 1; -- вÑполнÑеÑÑÑ Ð¿Ð°ÑаллелÑно: DELETE FROM website WHERE hits = 10; COMMIT;
Ðоманда DELETE не ÑÐ´ÐµÐ»Ð°ÐµÑ Ð½Ð¸Ñего, даже неÑмоÑÑÑ Ð½Ð° Ñо, ÑÑо ÑÑÑока Ñ website.hits = 10 бÑла в ÑаблиÑе и до, и поÑле вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ UPDATE. ÐÑо пÑоиÑÑ
Ð¾Ð´Ð¸Ñ Ð¿Ð¾ÑомÑ, ÑÑо ÑÑÑока Ñо знаÑением 9 до Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¿ÑопÑÑкаеÑÑÑ, а когда команда UPDATE завеÑÑаеÑÑÑ Ð¸ DELETE полÑÑÐ°ÐµÑ Ð¾ÑвободивÑÑÑÑÑ Ð±Ð»Ð¾ÐºÐ¸ÑовкÑ, ÑÑÑока Ñ 10 ÑепеÑÑ ÑодеÑÐ¶Ð¸Ñ 11, а ÑÑо знаÑение Ñже не ÑооÑвеÑÑÑвÑÐµÑ ÑÑловиÑ.
Так как в Ñежиме Read Committed ÐºÐ°Ð¶Ð´Ð°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð° наÑинаеÑÑÑ Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ Ñнимка ÑоÑÑоÑниÑ, коÑоÑÑй вклÑÑÐ°ÐµÑ ÑезÑлÑÑаÑÑ Ð²ÑÐµÑ ÑÑанзакÑий, заÑикÑиÑованнÑÑ Ðº ÑÑÐ¾Ð¼Ñ Ð¼Ð¾Ð¼ÐµÐ½ÑÑ, поÑледÑÑÑие ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ð² одной ÑÑанзакÑии бÑдÑÑ Ð² лÑбом ÑлÑÑае видеÑÑ ÑÑÑекÑÑ Ð²ÑÐµÑ Ð¿Ð°ÑаллелÑнÑÑ Ð·Ð°ÑикÑиÑованнÑÑ ÑÑанзакÑий. ÐопÑÐ¾Ñ Ð·Ð´ÐµÑÑ ÑоÑÑÐ¾Ð¸Ñ Ð² Ñом, Ð²Ð¸Ð´Ð¸Ñ Ð»Ð¸ одна команда абÑолÑÑно ÑоглаÑованное ÑоÑÑоÑние Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ .
ЧаÑÑиÑÐ½Ð°Ñ Ð¸Ð·Ð¾Ð»ÑÑÐ¸Ñ ÑÑанзакÑий, обеÑпеÑÐ¸Ð²Ð°ÐµÐ¼Ð°Ñ Ð² Ñежиме Read Committed, пÑиемлема Ð´Ð»Ñ Ð¼Ð½Ð¾Ð¶ÐµÑÑва пÑиложений. ÐÑÐ¾Ñ Ñежим бÑÑÑÑ Ð¸ пÑоÑÑ Ð² иÑполÑзовании, однако он Ð¿Ð¾Ð´Ñ Ð¾Ð´Ð¸Ñ Ð½Ðµ Ð´Ð»Ñ Ð²ÑÐµÑ ÑлÑÑаев. ÐÑиложениÑм, вÑполнÑÑÑим ÑложнÑе запÑоÑÑ Ð¸ изменениÑ, могÑÑ Ð¿Ð¾ÑÑебоваÑÑÑÑ Ð±Ð¾Ð»ÐµÐµ ÑÑÑого ÑоглаÑованное пÑедÑÑавление даннÑÑ , Ñем Ñо, ÑÑо даÑÑ Read Committed.
13.2.2. УÑÐ¾Ð²ÐµÐ½Ñ Ð¸Ð·Ð¾Ð»ÑÑии Repeatable Read
Ð Ñежиме Repeatable Read Ð²Ð¸Ð´Ð½Ñ ÑолÑко Ñе даннÑе, коÑоÑÑе бÑли заÑикÑиÑÐ¾Ð²Ð°Ð½Ñ Ð´Ð¾ наÑала ÑÑанзакÑии, но не Ð²Ð¸Ð´Ð½Ñ Ð½ÐµÐ·Ð°ÑикÑиÑованнÑе даннÑе и изменениÑ, пÑоизведÑннÑе дÑÑгими ÑÑанзакÑиÑми в пÑоÑеÑÑе вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½Ð¾Ð¹ ÑÑанзакÑии. (Ðднако запÑÐ¾Ñ Ð±ÑÐ´ÐµÑ Ð²Ð¸Ð´ÐµÑÑ ÑÑÑекÑÑ Ð¿ÑедÑдÑÑÐ¸Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ в Ñвоей ÑÑанзакÑии, неÑмоÑÑÑ Ð½Ð° Ñо, ÑÑо они не заÑикÑиÑованÑ.) ÐÑо Ñамое ÑÑÑогое ÑÑебование, коÑоÑое ÑÑандаÑÑ SQL Ð²Ð²Ð¾Ð´Ð¸Ñ Ð´Ð»Ñ ÑÑого ÑÑÐ¾Ð²Ð½Ñ Ð¸Ð·Ð¾Ð»ÑÑии, и пÑи его вÑполнении пÑедоÑвÑаÑаÑÑÑÑ Ð²Ñе ÑвлениÑ, опиÑаннÑе в ТаблиÑе 13.1, за иÑклÑÑением аномалий ÑеÑиализаÑии. Ðак бÑло Ñказано вÑÑе, ÑÑо не пÑоÑивоÑеÑÐ¸Ñ ÑÑандаÑÑÑ, Ñак как он опÑеделÑÐµÑ ÑолÑко минималÑнÑÑ Ð·Ð°ÑиÑÑ, коÑоÑÐ°Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° обеÑпеÑиваÑÑÑÑ Ð½Ð° каждом ÑÑовне изолÑÑии.
ÐÑÐ¾Ñ ÑÑÐ¾Ð²ÐµÐ½Ñ Ð¾ÑлиÑаеÑÑÑ Ð¾Ñ Read Committed Ñем, ÑÑо запÑÐ¾Ñ Ð² ÑÑанзакÑии данного ÑÑÐ¾Ð²Ð½Ñ Ð²Ð¸Ð´Ð¸Ñ Ñнимок даннÑÑ
на Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð½Ð°Ñала пеÑвого опеÑаÑоÑа в ÑÑанзакÑии (не ÑÑиÑÐ°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´ ÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ ÑÑанзакÑиÑми), а не наÑала ÑекÑÑего опеÑаÑоÑа. Таким обÑазом, поÑледоваÑелÑнÑе ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ SELECT в одной ÑÑанзакÑии видÑÑ Ð¾Ð´Ð½Ð¸ и Ñе же даннÑе; они не видÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹, внеÑÑннÑÑ
и заÑикÑиÑованнÑÑ
дÑÑгими ÑÑанзакÑиÑми поÑле наÑала иÑ
ÑекÑÑей ÑÑанзакÑии.
ÐÑиложениÑ, иÑполÑзÑÑÑие ÑÑÐ¾Ñ ÑÑовенÑ, Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ Ð³Ð¾ÑÐ¾Ð²Ñ Ð¿Ð¾Ð²ÑоÑиÑÑ ÑÑанзакÑии в ÑлÑÑае Ñбоев ÑеÑиализаÑии.
ÐÐ¾Ð¼Ð°Ð½Ð´Ñ UPDATE, DELETE, MERGE, SELECT FOR UPDATE и SELECT FOR SHARE ведÑÑ ÑÐµÐ±Ñ Ð¿Ð¾Ð´Ð¾Ð±Ð½Ð¾ SELECT пÑи поиÑке ÑелевÑÑ
ÑÑÑок: они найдÑÑ ÑолÑко Ñе ÑелевÑе ÑÑÑоки, коÑоÑÑе бÑли заÑикÑиÑÐ¾Ð²Ð°Ð½Ñ Ð½Ð° Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð½Ð°Ñала ÑÑанзакÑии. Ðднако к моменÑÑ, когда они бÑдÑÑ Ð½Ð°Ð¹Ð´ÐµÐ½Ñ, ÑÑи ÑелевÑе ÑÑÑоки могÑÑ Ð±ÑÑÑ Ñже Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ñ (а Ñакже ÑÐ´Ð°Ð»ÐµÐ½Ñ Ð¸Ð»Ð¸ заблокиÑованÑ) дÑÑгой паÑаллелÑной ÑÑанзакÑией. Ð ÑÑом ÑлÑÑае ÑÑанзакÑÐ¸Ñ Ð² Ñежиме Repeatable Read бÑÐ´ÐµÑ Ð¾Ð¶Ð¸Ð´Ð°ÑÑ ÑикÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð»Ð¸ оÑкаÑа пеÑвой изменÑÑÑей даннÑе ÑÑанзакÑии (еÑли она еÑÑ Ð²ÑполнÑеÑÑÑ). ÐÑли пеÑÐ²Ð°Ñ Ð¸Ð·Ð¼ÐµÐ½ÑÑÑÐ°Ñ ÑÑанзакÑÐ¸Ñ Ð¾ÑкаÑÑваеÑÑÑ, ÐµÑ ÑезÑлÑÑÐ°Ñ Ð¾ÑбÑаÑÑваеÑÑÑ Ð¸ ÑекÑÑÐ°Ñ ÑÑанзакÑÐ¸Ñ Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑодолжиÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ðµ изнаÑалÑно полÑÑенной ÑÑÑоки. ÐÑли же пеÑÐ²Ð°Ñ ÑÑанзакÑÐ¸Ñ Ð·Ð°ÑикÑиÑовалаÑÑ Ð¸ в ÑезÑлÑÑаÑе изменила или Ñдалила ÑÑÑ ÑÑÑокÑ, а не пÑоÑÑо заблокиÑовала еÑ, пÑоизойдÑÑ Ð¾ÑÐºÐ°Ñ ÑекÑÑей ÑÑанзакÑии Ñ ÑообÑением
ÐШÐÐÐÐ: не ÑдалоÑÑ ÑеÑиализоваÑÑ Ð´Ð¾ÑÑÑп из-за паÑаллелÑного изменениÑ
Ñак как ÑÑанзакÑÐ¸Ñ ÑÑÐ¾Ð²Ð½Ñ Repeatable Read не Ð¼Ð¾Ð¶ÐµÑ Ð¸Ð·Ð¼ÐµÐ½ÑÑÑ Ð¸Ð»Ð¸ блокиÑоваÑÑ ÑÑÑоки, изменÑннÑе дÑÑгими ÑÑанзакÑиÑми Ñ Ð¼Ð¾Ð¼ÐµÐ½Ñа ÐµÑ Ð½Ð°Ñала.
Ðогда пÑиложение полÑÑÐ°ÐµÑ ÑÑо ÑообÑение об оÑибке, оно должна пÑеÑваÑÑ ÑекÑÑÑÑ ÑÑанзакÑÐ¸Ñ Ð¸ попÑÑаÑÑÑÑ Ð¿Ð¾Ð²ÑоÑиÑÑ ÐµÑ Ñ Ñамого наÑала. Ðо вÑоÑой Ñаз ÑÑанзакÑÐ¸Ñ ÑÐ²Ð¸Ð´Ð¸Ñ Ð²Ð½ÐµÑÑнное до ÑÑого изменение как ÑаÑÑÑ Ð½Ð°ÑалÑного Ñнимка Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ , Ñак ÑÑо Ð½Ð¾Ð²Ð°Ñ Ð²ÐµÑÑÐ¸Ñ ÑÑÑоки вполне Ð¼Ð¾Ð¶ÐµÑ Ð¸ÑполÑзоваÑÑÑÑ Ð² каÑеÑÑве оÑпÑавной ÑоÑки Ð´Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² повÑоÑной ÑÑанзакÑии.
ÐамеÑÑÑе, ÑÑо поÑÑебноÑÑÑ Ð² повÑоÑении ÑÑанзакÑии Ð¼Ð¾Ð¶ÐµÑ Ð²Ð¾Ð·Ð½Ð¸ÐºÐ½ÑÑÑ, ÑолÑко еÑли ÑÑа ÑÑанзакÑÐ¸Ñ Ð¸Ð·Ð¼ÐµÐ½ÑÐµÑ Ð´Ð°Ð½Ð½Ñе; в ÑÑанзакÑиÑÑ , коÑоÑÑе ÑолÑко ÑиÑаÑÑ Ð´Ð°Ð½Ð½Ñе, конÑликÑов ÑеÑиализаÑии не бÑваеÑ.
Режим Repeatable Read ÑÑÑого гаÑанÑиÑÑеÑ, ÑÑо ÐºÐ°Ð¶Ð´Ð°Ñ ÑÑанзакÑÐ¸Ñ Ð²Ð¸Ð´Ð¸Ñ Ð¿Ð¾Ð»Ð½Ð¾ÑÑÑÑ ÑÑабилÑное пÑедÑÑавление Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ . Ðднако ÑÑо пÑедÑÑавление не обÑзаÑелÑно бÑÐ´ÐµÑ ÑоглаÑовано Ñ Ð½ÐµÐºÐ¾ÑоÑÑм поÑледоваÑелÑнÑм вÑполнением ÑÑанзакÑий одного ÑÑовнÑ. ÐапÑимеÑ, даже ÑÑанзакÑиÑ, коÑоÑÐ°Ñ ÑолÑко ÑиÑÐ°ÐµÑ Ð´Ð°Ð½Ð½Ñе, в ÑÑом Ñежиме Ð¼Ð¾Ð¶ÐµÑ Ð²Ð¸Ð´ÐµÑÑ ÑÑÑокÑ, показÑваÑÑÑÑ, ÑÑо некоÑоÑое задание завеÑÑено, но не видеÑÑ Ð¾Ð´Ð½Ñ Ð¸Ð· ÑÑÑок логиÑеÑÐºÐ¸Ñ ÑаÑÑей заданиÑ, Ñак как ÑÑа ÑÑанзакÑÐ¸Ñ Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑоÑиÑаÑÑ Ð±Ð¾Ð»ÐµÐµ ÑаннÑÑ Ð²ÐµÑÑÐ¸Ñ ÑÑÑоки заданиÑ, Ñем ÑÑ, Ð´Ð»Ñ ÐºÐ¾ÑоÑой паÑаллелÑно добавлÑлаÑÑ Ð¾ÑеÑÐµÐ´Ð½Ð°Ñ Ð»Ð¾Ð³Ð¸ÑеÑÐºÐ°Ñ ÑаÑÑÑ. СÑÑого иÑполниÑÑ Ð±Ð¸Ð·Ð½ÐµÑ-пÑавила в ÑÑанзакÑиÑÑ , ÑабоÑаÑÑÐ¸Ñ Ð½Ð° ÑÑом ÑÑовне изолÑÑии, ÑкоÑее вÑего не ÑдаÑÑÑÑ Ð±ÐµÐ· ÑвнÑÑ Ð±Ð»Ð¾ÐºÐ¸Ñовок конÑликÑÑÑÑÐ¸Ñ ÑÑанзакÑий.
ÐÐ»Ñ ÑеализаÑии ÑÑÐ¾Ð²Ð½Ñ Ð¸Ð·Ð¾Ð»ÑÑии Repeatable Read пÑименÑеÑÑÑ Ð¿Ð¾Ð´Ñ Ð¾Ð´, коÑоÑÑй назÑваеÑÑÑ Ð² академиÑеÑкой лиÑеÑаÑÑÑе по базам даннÑÑ Ð¸ в дÑÑÐ³Ð¸Ñ Ð¡Ð£ÐÐ ÐзолÑÑÐ¸Ñ Ñнимков (Snapshot Isolation). Ðо ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ Ñ ÑиÑÑемами, иÑполÑзÑÑÑими ÑÑадиÑионнÑй меÑод блокиÑовок, заÑÑÑднÑÑÑий паÑаллелÑное вÑполнение, пÑи ÑÑом Ð¿Ð¾Ð´Ñ Ð¾Ð´Ðµ наблÑдаеÑÑÑ Ð´ÑÑгое поведение и дÑÑÐ³Ð°Ñ Ð¿ÑоизводиÑелÑноÑÑÑ. РнекоÑоÑÑÑ Ð¡Ð£ÐРмогÑÑ ÑÑÑеÑÑвоваÑÑ Ð´Ð°Ð¶Ðµ два оÑделÑнÑÑ ÑÑÐ¾Ð²Ð½Ñ Repeatable Read и Snapshot Isolation Ñ ÑазлиÑнÑм поведением. ÐопÑÑкаемÑе оÑобÑе ÑÑловиÑ, пÑедÑÑавлÑÑÑие оÑлиÑÐ¸Ñ Ð´Ð²ÑÑ ÑÑÐ¸Ñ Ð¿Ð¾Ð´Ñ Ð¾Ð´Ð¾Ð², не бÑли ÑоÑÐ¼Ð°Ð»Ð¸Ð·Ð¾Ð²Ð°Ð½Ñ ÑазÑабоÑÑиками ÑеоÑии ÐРдо ÑазвиÑÐ¸Ñ ÑÑандаÑÑа SQL и Ð¸Ñ ÑаÑÑмоÑÑение вÑÑ Ð¾Ð´Ð¸Ñ Ð·Ð° Ñамки данного ÑÑководÑÑва. Рполном обÑÑме ÑÑа Ñема оÑвеÑаеÑÑÑ Ð² [berenson95].
ÐÑимеÑание
Ðо веÑÑии 9.1 в PostgreSQL пÑи запÑоÑе Ñежима Serializable поведение ÑиÑÑÐµÐ¼Ñ Ð² ÑоÑноÑÑи ÑооÑвеÑÑÑвовало вÑÑеопиÑанномÑ. Таким обÑазом, ÑÑÐ¾Ð±Ñ ÑейÑÐ°Ñ Ð¿Ð¾Ð»ÑÑиÑÑ ÑÑаÑое поведение Serializable, нÑжно запÑаÑиваÑÑ Ñежим Repeatable Read.
13.2.3. УÑÐ¾Ð²ÐµÐ½Ñ Ð¸Ð·Ð¾Ð»ÑÑии Serializable
УÑÐ¾Ð²ÐµÐ½Ñ Serializable обеÑпеÑÐ¸Ð²Ð°ÐµÑ ÑамÑÑ ÑÑÑогÑÑ Ð¸Ð·Ð¾Ð»ÑÑÐ¸Ñ ÑÑанзакÑий. Ðа ÑÑом ÑÑовне моделиÑÑеÑÑÑ Ð¿Ð¾ÑледоваÑелÑное вÑполнение вÑÐµÑ Ð·Ð°ÑикÑиÑованнÑÑ ÑÑанзакÑий, как еÑли Ð±Ñ ÑÑанзакÑии вÑполнÑлиÑÑ Ð¾Ð´Ð½Ð° за дÑÑгой, поÑледоваÑелÑно, а не паÑаллелÑно. Ðднако, как и на ÑÑовне Repeatable Read, на ÑÑом ÑÑовне пÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ Ð³Ð¾ÑÐ¾Ð²Ñ Ð¿Ð¾Ð²ÑоÑÑÑÑ ÑÑанзакÑии из-за Ñбоев ÑеÑиализаÑии. ФакÑиÑеÑки ÑÑÐ¾Ñ Ñежим изолÑÑии ÑабоÑÐ°ÐµÑ Ñак же, как и Repeatable Read, ÑолÑко он дополниÑелÑно оÑÑÐ»ÐµÐ¶Ð¸Ð²Ð°ÐµÑ ÑÑловиÑ, пÑи коÑоÑÑÑ ÑезÑлÑÑÐ°Ñ Ð¿Ð°ÑаллелÑно вÑполнÑемÑÑ ÑеÑиализÑемÑÑ ÑÑанзакÑий Ð¼Ð¾Ð¶ÐµÑ Ð½Ðµ ÑоглаÑовÑваÑÑÑÑ Ñ ÑезÑлÑÑаÑом ÑÑÐ¸Ñ Ð¶Ðµ ÑÑанзакÑий, вÑполнÑемÑÑ Ð¿Ð¾ оÑеÑеди. ÐÑо оÑÑлеживание не пÑивноÑÐ¸Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑÑ Ð¿ÑепÑÑÑÑвий Ð´Ð»Ñ Ð²ÑполнениÑ, кÑоме ÑÐµÑ , ÑÑо пÑиÑÑÑи ÑÐµÐ¶Ð¸Ð¼Ñ Repeatable Read, но Ñем не менее ÑоздаÑÑ Ð½ÐµÐºÐ¾ÑоÑÑÑ Ð´Ð¾Ð±Ð°Ð²Ð¾ÑнÑÑ Ð½Ð°Ð³ÑÑзкÑ, а пÑи вÑÑвлении иÑклÑÑиÑелÑнÑÑ ÑÑловий ÑегиÑÑÑиÑÑеÑÑÑ Ð°Ð½Ð¾Ð¼Ð°Ð»Ð¸Ñ ÑеÑиализаÑии и пÑоиÑÑ Ð¾Ð´Ð¸Ñ Ñбой ÑеÑиализаÑии.
ÐапÑимеÑ, ÑаÑÑмоÑÑим ÑаблиÑÑ mytab, изнаÑалÑно ÑодеÑжаÑÑÑ:
class | value
-------+-------
1 | 10
1 | 20
2 | 100
2 | 200
ÐÑедположим, ÑÑо ÑеÑиализÑÐµÐ¼Ð°Ñ ÑÑанзакÑÐ¸Ñ A вÑÑиÑлÑеÑ:
SELECT SUM(value) FROM mytab WHERE class = 1;
а заÑем вÑÑавлÑÐµÑ ÑезÑлÑÑÐ°Ñ (30) в поле value в новÑÑ ÑÑÑÐ¾ÐºÑ Ñо знаÑением class = 2. Ð ÑÑо же вÑÐµÐ¼Ñ ÑеÑиализÑÐµÐ¼Ð°Ñ ÑÑанзакÑÐ¸Ñ B вÑÑиÑлÑеÑ:
SELECT SUM(value) FROM mytab WHERE class = 2;
полÑÑÐ°ÐµÑ ÑезÑлÑÑÐ°Ñ 300 и вÑÑавлÑÐµÑ ÐµÐ³Ð¾ в новÑÑ ÑÑÑÐ¾ÐºÑ Ñо знаÑением class = 1. ÐаÑем обе ÑÑанзакÑии пÑÑаÑÑÑÑ Ð·Ð°ÑикÑиÑоваÑÑÑÑ. ÐÑли Ð±Ñ Ð¾Ð´Ð½Ð° из ÑÑиÑ
ÑÑанзакÑий ÑабоÑала в Ñежиме Repeatable Read, заÑикÑиÑоваÑÑÑÑ Ð¼Ð¾Ð³Ð»Ð¸ Ð±Ñ Ð¾Ð±Ðµ; но Ñак как полÑÑеннÑй ÑезÑлÑÑÐ°Ñ Ð½Ðµ ÑооÑвеÑÑÑвовал Ð±Ñ Ð¿Ð¾ÑледоваÑелÑÐ½Ð¾Ð¼Ñ Ð¿Ð¾ÑÑдкÑ, в Ñежиме Serializable бÑÐ´ÐµÑ Ð·Ð°ÑикÑиÑована ÑолÑко одна ÑÑанзакÑиÑ, а вÑоÑÐ°Ñ Ð·Ð°ÐºÐ¾Ð½ÑиÑÑÑ Ð¾ÑкаÑом Ñ ÑообÑением:
ÐШÐÐÐÐ: не ÑдалоÑÑ ÑеÑиализоваÑÑ Ð´Ð¾ÑÑÑп из-за завиÑимоÑÑей ÑÑениÑ/запиÑи Ð¼ÐµÐ¶Ð´Ñ ÑÑанзакÑиÑми
ÐÑо обÑÑÑнÑеÑÑÑ Ñем, ÑÑо пÑи вÑполнении A пеÑед B ÑÑанзакÑÐ¸Ñ B вÑÑиÑлила Ð±Ñ ÑÑÐ¼Ð¼Ñ 330, а не 300, а пÑи вÑполнении в обÑаÑном поÑÑдке A вÑÑиÑлила Ð±Ñ Ð´ÑÑгÑÑ ÑÑммÑ.
РаÑÑÑиÑÑваÑ, ÑÑо ÑеÑиализÑемÑе ÑÑанзакÑии пÑедоÑвÑаÑÑÑ Ð°Ð½Ð¾Ð¼Ð°Ð»Ð¸Ð¸, важно понимаÑÑ, ÑÑо лÑбÑе даннÑе, полÑÑеннÑе из поÑÑоÑнной ÑаблиÑÑ Ð¿Ð¾Ð»ÑзоваÑелÑ, не Ð´Ð¾Ð»Ð¶Ð½Ñ ÑÑиÑаÑÑÑÑ Ð´ÐµÐ¹ÑÑвиÑелÑнÑми, пока ÑÑанзакÑиÑ, пÑоÑиÑавÑÐ°Ñ Ð¸Ñ , не бÑÐ´ÐµÑ ÑÑпеÑно заÑикÑиÑована. ÐÑо веÑно даже Ð´Ð»Ñ ÑÑанзакÑий, не модиÑиÑиÑÑÑÑÐ¸Ñ Ð´Ð°Ð½Ð½Ñе, за иÑклÑÑением ÑлÑÑаÑ, когда даннÑе ÑÑиÑÑваÑÑÑÑ Ð² оÑкладÑваемой ÑÑанзакÑии Ñакого Ñипа. Ð ÑÑом ÑлÑÑае даннÑе могÑÑ ÑÑиÑаÑÑÑÑ Ð´ÐµÐ¹ÑÑвиÑелÑнÑми, Ñак как ÑÐ°ÐºÐ°Ñ ÑÑанзакÑÐ¸Ñ Ð¶Ð´ÑÑ, пока не ÑÐ¼Ð¾Ð¶ÐµÑ Ð¿Ð¾Ð»ÑÑиÑÑ Ñнимок, гаÑанÑиÑованно пÑедоÑвÑаÑаÑÑий подобнÑе пÑоблемÑ. Ðо вÑÐµÑ Ð¾ÑÑалÑнÑÑ ÑлÑÑаÑÑ Ð¿ÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð½Ðµ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¿Ð¾Ð»Ð°Ð³Ð°ÑÑÑÑ Ð½Ð° ÑезÑлÑÑаÑÑ ÑÑÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½ÑÑ Ð² ÑÑанзакÑии, коÑоÑÐ°Ñ Ð½Ðµ бÑла заÑикÑиÑована; в ÑлÑÑае оÑибки и оÑкаÑа пÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¿Ð¾Ð²ÑоÑÑÑÑ ÑÑанзакÑиÑ, пока она не бÑÐ´ÐµÑ Ð·Ð°Ð²ÐµÑÑена ÑÑпеÑно.
ÐÐ»Ñ Ð¿Ð¾Ð»Ð½Ð¾Ð¹ гаÑанÑии ÑеÑиализÑемоÑÑи в Postgres Pro пÑименÑÑÑÑÑ Ð¿ÑедикаÑнÑе блокиÑовки, Ñо еÑÑÑ Ð±Ð»Ð¾ÐºÐ¸Ñовки, позволÑÑÑие опÑеделиÑÑ, когда запиÑÑ Ð¼Ð¾Ð³Ð»Ð° Ð±Ñ Ð¿Ð¾Ð²Ð»Ð¸ÑÑÑ Ð½Ð° ÑезÑлÑÑÐ°Ñ Ð¿ÑедÑдÑÑего ÑÑÐµÐ½Ð¸Ñ Ð¿Ð°ÑаллелÑной ÑÑанзакÑии, еÑли Ð±Ñ ÑÑа запиÑÑ Ð²ÑполнÑлаÑÑ ÑнаÑала. Ð Postgres Pro ÑÑи блокиÑовки не пÑиводÑÑ Ðº ÑакÑиÑеÑким блокиÑовкам даннÑÑ
и, ÑледоваÑелÑно, никоим обÑазом не могÑÑ Ð¿Ð¾Ð²Ð»ÐµÑÑ Ð²Ð·Ð°Ð¸Ð¼Ð¾Ð±Ð»Ð¾ÐºÐ¸Ñовки ÑÑанзакÑий. Ðни помогаÑÑ Ð²ÑÑвиÑÑ Ð¸ оÑмеÑиÑÑ Ð·Ð°Ð²Ð¸ÑимоÑÑи Ð¼ÐµÐ¶Ð´Ñ Ð¿Ð°ÑаллелÑнÑми ÑÑанзакÑиÑми ÑÑÐ¾Ð²Ð½Ñ Serializable, коÑоÑÑе в опÑеделÑннÑÑ
ÑоÑеÑаниÑÑ
могÑÑ Ð¿ÑиводиÑÑ Ðº аномалиÑм ÑеÑиализаÑии. ТÑанзакÑии Read Committed или Repeatable Read Ð´Ð»Ñ Ð¾Ð±ÐµÑпеÑÐµÐ½Ð¸Ñ ÑелоÑÑноÑÑи даннÑÑ
, напÑоÑив, Ð´Ð¾Ð»Ð¶Ð½Ñ Ð»Ð¸Ð±Ð¾ блокиÑоваÑÑ ÑаблиÑÑ Ñеликом, ÑÑо помеÑÐ°ÐµÑ Ð¿Ð¾Ð»ÑзоваÑелÑм обÑаÑаÑÑÑÑ Ðº ÑÑим ÑаблиÑам, либо пÑименÑÑÑ SELECT FOR UPDATE или SELECT FOR SHARE, ÑÑо не ÑолÑко заблокиÑÑÐµÑ Ð´ÑÑгие ÑÑанзакÑии, но и ÑоздаÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑÑ Ð½Ð°Ð³ÑÑÐ·ÐºÑ Ð½Ð° диÑк.
ÐÑедикаÑнÑе блокиÑовки в Postgres Pro, как и в болÑÑинÑÑве дÑÑгиÑ
СУÐÐ, ÑÑÑанавливаÑÑÑÑ Ð´Ð»Ñ Ð´Ð°Ð½Ð½ÑÑ
, ÑакÑиÑеÑки иÑполÑзÑемÑÑ
в ÑÑанзакÑии. Ðни оÑобÑажаÑÑÑÑ Ð² ÑиÑÑемном пÑедÑÑавлении pg_locks Ñо знаÑением mode ÑавнÑм SIReadLock. Ðакие именно блокиÑовки бÑдÑÑ Ð·Ð°ÑÑÐµÐ±Ð¾Ð²Ð°Ð½Ñ Ð¿Ñи вÑполнении запÑоÑа, завиÑÐ¸Ñ Ð¾Ñ Ð¿Ð»Ð°Ð½Ð° запÑоÑа, пÑи ÑÑом деÑализиÑованнÑе блокиÑовки (напÑимеÑ, блокиÑовки ÑÑÑок) могÑÑ Ð¾Ð±ÑединÑÑÑÑÑ Ð² более обÑие (напÑимеÑ, в блокиÑовки ÑÑÑаниÑ) в пÑоÑеÑÑе ÑÑанзакÑии Ð´Ð»Ñ Ñкономии памÑÑи, ÑаÑÑ
одÑемой Ð´Ð»Ñ Ð¾ÑÑÐ»ÐµÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ Ð±Ð»Ð¾ÐºÐ¸Ñовок. ТÑанзакÑÐ¸Ñ READ ONLY Ð¼Ð¾Ð¶ÐµÑ Ð´Ð°Ð¶Ðµ оÑвободиÑÑ Ñвои блокиÑовки SIRead до завеÑÑениÑ, еÑли обнаÑÑживаеÑÑÑ, ÑÑо конÑликÑÑ, коÑоÑÑе могли Ð±Ñ Ð¿ÑивеÑÑи к аномалии ÑеÑиализаÑии, иÑклÑÑенÑ. Ðа Ñамом деле Ð´Ð»Ñ ÑÑанзакÑий READ ONLY ÑÑÐ¾Ñ ÑÐ°ÐºÑ ÑаÑе вÑего ÑÑÑанавливаеÑÑÑ Ð² Ñамом наÑале, Ñак ÑÑо они обÑ
одÑÑÑÑ Ð±ÐµÐ· пÑедикаÑнÑÑ
блокиÑовок. ÐÑли же Ð²Ñ Ñвно запÑоÑиÑе ÑÑанзакÑÐ¸Ñ SERIALIZABLE READ ONLY DEFERRABLE, она бÑÐ´ÐµÑ Ð·Ð°Ð±Ð»Ð¾ÐºÐ¸Ñована до ÑеÑ
поÑ, пока не ÑÐ¼Ð¾Ð¶ÐµÑ ÑÑÑановиÑÑ ÑÑÐ¾Ñ ÑакÑ. (ÐÑо единÑÑвеннÑй ÑлÑÑай, когда ÑÑанзакÑии ÑÑÐ¾Ð²Ð½Ñ Serializable блокиÑÑÑÑÑÑ, а ÑÑанзакÑии Repeatable Read â неÑ.) С дÑÑгой ÑÑоÑонÑ, блокиÑовки SIRead ÑаÑÑо Ð´Ð¾Ð»Ð¶Ð½Ñ ÑоÑ
ÑанÑÑÑÑÑ Ð¸ поÑле ÑикÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑÑанзакÑии, пока не бÑдÑÑ Ð·Ð°Ð²ÐµÑÑÐµÐ½Ñ Ð´ÑÑгие, наложивÑиеÑÑ Ð½Ð° Ð½ÐµÑ ÑÑанзакÑии.
ÐÑи пÑавилÑном иÑполÑзовании ÑеÑиализÑемÑе ÑÑанзакÑии могÑÑ Ð·Ð½Ð°ÑиÑелÑно ÑпÑоÑÑиÑÑ ÑазÑабоÑÐºÑ Ð¿Ñиложений. ÐаÑанÑÐ¸Ñ Ñого, ÑÑо лÑбое ÑоÑеÑание ÑÑпеÑно заÑикÑиÑованнÑÑ
паÑаллелÑнÑÑ
ÑеÑиализÑемÑÑ
ÑÑанзакÑий даÑÑ ÑÐ¾Ñ Ð¶Ðµ ÑезÑлÑÑаÑ, ÑÑо и поÑледоваÑелÑноÑÑÑ ÑÑиÑ
ÑÑанзакÑий, вÑполненнÑÑ
по оÑеÑеди, ознаÑаеÑ, ÑÑо еÑли Ð²Ñ ÑвеÑенÑ, ÑÑо единÑÑÐ²ÐµÐ½Ð½Ð°Ñ ÑÑанзакÑÐ¸Ñ Ð¾Ð¿ÑеделÑнного ÑодеÑÐ¶Ð°Ð½Ð¸Ñ ÑабоÑÐ°ÐµÑ Ð¿ÑавилÑно, когда она запÑÑкаеÑÑÑ Ð¾ÑделÑно, Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе бÑÑÑ ÑвеÑенÑ, ÑÑо она бÑÐ´ÐµÑ ÑабоÑаÑÑ Ñак же пÑавилÑно в лÑбом ÑоÑеÑании ÑеÑиализÑемÑÑ
ÑÑанзакÑий, вне завиÑимоÑÑи Ð¾Ñ Ñого, ÑÑо они делаÑÑ, либо же она не бÑÐ´ÐµÑ Ð·Ð°ÑикÑиÑована ÑÑпеÑно. ÐÑи ÑÑом важно, ÑÑÐ¾Ð±Ñ Ð² ÑÑеде, где пÑименÑеÑÑÑ ÑÑÐ¾Ñ Ð¿Ð¾Ð´Ñ
од, бÑла Ñеализована обÑÐ°Ñ Ð¾Ð±ÑабоÑка Ñбоев ÑеÑиализаÑии (коÑоÑÑе можно опÑеделиÑÑ Ð¿Ð¾ знаÑÐµÐ½Ð¸Ñ SQLSTATE '40001'), Ñак как заведомо опÑеделиÑÑ, какие именно ÑÑанзакÑии могÑÑ ÑÑаÑÑ Ð¶ÐµÑÑвами завиÑимоÑÑей ÑÑениÑ/запиÑи и не бÑдÑÑ Ð·Ð°ÑикÑиÑÐ¾Ð²Ð°Ð½Ñ Ð´Ð»Ñ Ð¿ÑедоÑвÑаÑÐµÐ½Ð¸Ñ Ð°Ð½Ð¾Ð¼Ð°Ð»Ð¸Ð¹ ÑеÑиализаÑии, обÑÑно оÑÐµÐ½Ñ Ñложно. ÐÑÑлеживание завиÑимоÑÑей ÑÑениÑ-запиÑи неизбежно ÑоздаÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑÑ Ð½Ð°Ð³ÑÑзкÑ, как и пеÑезапÑÑк ÑÑанзакÑий, не заÑикÑиÑованнÑÑ
из-за Ñбоев ÑеÑиализаÑии, но еÑли на дÑÑгÑÑ ÑаÑÑ Ð²ÐµÑов положиÑÑ Ð½Ð°Ð³ÑÑÐ·ÐºÑ Ð¸ блокиÑование, ÑвÑзаннÑе Ñ Ð¿Ñименением ÑвнÑÑ
блокиÑовок и SELECT FOR UPDATE или SELECT FOR SHARE, иÑполÑзоваÑÑ ÑеÑиализÑемÑе ÑÑанзакÑии в ÑÑде ÑлÑÑаев окажеÑÑÑ Ð²Ñгоднее.
Тогда как ÑÑÐ¾Ð²ÐµÐ½Ñ Ð¸Ð·Ð¾Ð»ÑÑии ÑÑанзакÑий Serializable в Postgres Pro позволÑÐµÑ ÑикÑиÑоваÑÑ Ð¿Ð°ÑаллелÑнÑе ÑÑанзакÑии, ÑолÑко еÑли еÑÑÑ ÑвеÑенноÑÑÑ, ÑÑо ÑÐ¾Ñ Ð¶Ðµ ÑезÑлÑÑÐ°Ñ Ð±ÑÐ´ÐµÑ Ð¿Ð¾Ð»ÑÑен пÑи поÑледоваÑелÑном Ð¸Ñ Ð²Ñполнении, он не вÑегда пÑедоÑвÑаÑÐ°ÐµÑ Ð¾Ñибки, коÑоÑÑе не возникли Ð±Ñ Ð¿Ñи дейÑÑвиÑелÑно поÑледоваÑелÑном вÑполнении. Ð ÑаÑÑноÑÑи, можно ÑÑолкнÑÑÑÑÑ Ñ Ð½Ð°ÑÑÑениÑми огÑаниÑений ÑникалÑноÑÑи, вÑзваннÑми наложением ÑеÑиализÑемÑÑ ÑÑанзакÑий, даже поÑле Ñвной пÑовеÑки оÑÑÑÑÑÑÐ²Ð¸Ñ ÐºÐ»ÑÑа пеÑед добавлением его. ÐÑого можно избежаÑÑ, еÑли вÑе ÑеÑиализÑемÑе ÑÑанзакÑии, добавлÑÑÑие поÑенÑиалÑно конÑликÑÑÑÑие клÑÑи, бÑдÑÑ Ð¿ÑедваÑиÑелÑно Ñвно пÑовеÑÑÑÑ, можно ли вÑÑавиÑÑ ÐºÐ»ÑÑ. ÐапÑимеÑ, пÑиложение, добавлÑÑÑее новÑй клÑÑ, Ð¼Ð¾Ð¶ÐµÑ Ð·Ð°Ð¿ÑаÑиваÑÑ ÐµÐ³Ð¾ Ñ Ð¿Ð¾Ð»ÑзоваÑÐµÐ»Ñ Ð¸ заÑем пÑовеÑÑÑÑ, ÑÑÑеÑÑвÑÐµÑ Ð»Ð¸ он, ÑнаÑала пÑÑаÑÑÑ Ð½Ð°Ð¹Ñи его, либо генеÑиÑоваÑÑ Ð½Ð¾Ð²Ñй клÑÑ, вÑбиÑÐ°Ñ Ð¼Ð°ÐºÑималÑное ÑÑÑеÑÑвÑÑÑее знаÑение и ÑвелиÑÐ¸Ð²Ð°Ñ ÐµÐ³Ð¾ на один. ÐÑли некоÑоÑÑе ÑеÑиализÑемÑе ÑÑанзакÑии добавлÑÑÑ Ð½Ð¾Ð²Ñе клÑÑи ÑÑазÑ, не ÑледÑÑ ÑÑÐ¾Ð¼Ñ Ð¿ÑоÑоколÑ, Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ñ Ð½Ð°ÑÑÑÐµÐ½Ð¸Ñ Ð¾Ð³ÑаниÑений ÑникалÑноÑÑи, даже когда они не наблÑдалиÑÑ Ð±Ñ Ð¿Ñи поÑледоваÑелÑном вÑполнении ÑÑÐ¸Ñ ÑÑанзакÑий.
ÐÑименÑÑ ÑеÑиализÑемÑе ÑÑанзакÑии Ð´Ð»Ñ ÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ ÐºÐ¾Ð½ÐºÑÑенÑнÑм доÑÑÑпом, пÑимиÑе к ÑÐ²ÐµÐ´ÐµÐ½Ð¸Ñ ÑледÑÑÑие ÑекомендаÑии:
ÐбÑÑвлÑйÑе ÑÑанзакÑии как
READ ONLY, еÑли ÑÑо оÑÑÐ°Ð¶Ð°ÐµÑ Ð¸Ñ ÑÑÑÑ.УпÑавлÑйÑе ÑиÑлом акÑивнÑÑ Ð¿Ð¾Ð´ÐºÐ»ÑÑений, пÑи Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ÑÑи иÑполÑзÑÑ Ð¿Ñл Ñоединений. ÐÑо вÑегда полезно Ð´Ð»Ñ ÑвелиÑÐµÐ½Ð¸Ñ Ð¿ÑоизводиÑелÑноÑÑи, но оÑобенно важно ÑÑо в загÑÑженной ÑиÑÑеме Ñ ÑеÑиализÑемÑми ÑÑанзакÑиÑми.
ÐаклÑÑайÑе в Ð¾Ð´Ð½Ñ ÑÑанзакÑÐ¸Ñ Ð½Ðµ болÑÑе команд, Ñем Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ Ð´Ð»Ñ Ð¾Ð±ÐµÑпеÑÐµÐ½Ð¸Ñ ÑелоÑÑноÑÑи.
Ðе оÑÑавлÑйÑе ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Â«Ð¿ÑоÑÑаиваÑÑими в ÑÑанзакÑии» долÑÑе, Ñем Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾. ÐÐ»Ñ Ð°Ð²ÑомаÑиÑеÑкого оÑклÑÑÐµÐ½Ð¸Ñ Ð·Ð°ÑÑнÑвÑÐ¸Ñ ÑÑ ÑÑанзакÑий можно пÑимениÑÑ Ð¿Ð°ÑамеÑÑ ÐºÐ¾Ð½ÑигÑÑаÑии idle_in_transaction_session_timeout.
ÐÑклÑÑиÑе ÑвнÑе блокиÑовки,
SELECT FOR UPDATEиSELECT FOR SHAREÑам, где они не нÑÐ¶Ð½Ñ Ð±Ð»Ð°Ð³Ð¾Ð´Ð°ÑÑ Ð·Ð°ÑиÑе, авÑомаÑиÑеÑки пÑедоÑÑавлÑемой ÑеÑиализÑемÑми ÑÑанзакÑиÑми.Ðогда ÑиÑÑема вÑнÑждена обÑединÑÑÑ Ð¿ÑедикаÑнÑе блокиÑовки ÑÑÐ¾Ð²Ð½Ñ ÑÑÑаниÑÑ Ð² Ð¾Ð´Ð½Ñ Ð¿ÑедикаÑнÑÑ Ð±Ð»Ð¾ÐºÐ¸ÑÐ¾Ð²ÐºÑ ÑÑÐ¾Ð²Ð½Ñ ÑаблиÑÑ Ð¸Ð·-за Ð½ÐµÑ Ð²Ð°Ñки памÑÑи, Ð¼Ð¾Ð¶ÐµÑ Ð²Ð¾Ð·ÑаÑÑи ÑаÑÑоÑа Ñбоев ÑеÑиализаÑии. ÐзбежаÑÑ ÑÑого можно, ÑвелиÑив паÑамеÑÑ max_pred_locks_per_transaction, max_pred_locks_per_relation и/или max_pred_locks_per_page.
ÐоÑледоваÑелÑное ÑканиÑование вÑегда влеÑÑÑ Ð·Ð° Ñобой пÑедикаÑнÑÑ Ð±Ð»Ð¾ÐºÐ¸ÑÐ¾Ð²ÐºÑ Ð½Ð° ÑÑовне ÑаблиÑÑ. ÐÑо пÑÐ¸Ð²Ð¾Ð´Ð¸Ñ Ðº ÑвелиÑÐµÐ½Ð¸Ñ Ñбоев ÑеÑиализаÑии. Ð ÑÐ°ÐºÐ¸Ñ ÑиÑÑаÑиÑÑ Ð±ÑÐ²Ð°ÐµÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ð¾ ÑклониÑÑ ÑиÑÑÐµÐ¼Ñ Ðº иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑов, ÑменÑÑÐ°Ñ random_page_cost и/или ÑвелиÑÐ¸Ð²Ð°Ñ cpu_tuple_cost. Ðднако ÑÑÑ Ð²Ð°Ð¶Ð½Ð¾ ÑопоÑÑавиÑÑ Ð²ÑигÑÑÑ Ð¾Ñ ÑменÑÑÐµÐ½Ð¸Ñ ÑиÑла оÑкаÑов и пеÑезапÑÑков ÑÑанзакÑий Ñ Ð¿ÑоигÑÑÑем Ð¾Ñ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾Ð³Ð¾ менее ÑÑÑекÑивного вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿ÑоÑов.
ÐÐ»Ñ ÑеализаÑии ÑÑÐ¾Ð²Ð½Ñ Ð¸Ð·Ð¾Ð»ÑÑии Serializable пÑименÑеÑÑÑ Ð¿Ð¾Ð´Ñ Ð¾Ð´, коÑоÑÑй назÑваеÑÑÑ Ð² академиÑеÑкой лиÑеÑаÑÑÑе по базам даннÑÑ ÐзолÑÑÐ¸Ñ Ñнимков (Snapshot Isolation), Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑми пÑовеÑками на пÑÐµÐ´Ð¼ÐµÑ Ð°Ð½Ð¾Ð¼Ð°Ð»Ð¸Ð¹ ÑеÑиализаÑии. Ðо ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ Ñ Ð´ÑÑгими ÑиÑÑемами, иÑполÑзÑÑÑими ÑÑадиÑионнÑй меÑод блокиÑовок, пÑи ÑÑом Ð¿Ð¾Ð´Ñ Ð¾Ð´Ðµ наблÑдаеÑÑÑ Ð´ÑÑгое поведение и дÑÑÐ³Ð°Ñ Ð¿ÑоизводиÑелÑноÑÑÑ. ÐодÑобнее ÑÑо оÑвеÑаеÑÑÑ Ð² [ports12].