Wyjaśnienie transakcji SQL i ACID: COMMIT, ROLLBACK i poziomy izolacji

  1. Strona główna
  2. Blog
  3. Bazy danych i SQL

Bazy danych i SQL

Wyjaśnienie transakcji SQL i ACID: COMMIT, ROLLBACK i poziomy izolacji

Co się stanie, jeśli serwer ulegnie awarii w połowie przenoszenia pieniędzy między dwoma kontami? Odpowiedzią są transakcje. Zobacz jak działają na prawdziwym przykładzie, co oznacza ACID i jak wybrać poziom izolacji.

9 min czytania
Wyjaśniono transakcje SQL i ACID: COMMIT, ROLLBACK i poziomy izolacji

Najważniejsze

  • transakcja grupuje instrukcje w taki sposób, że wszystkie razem odniosą sukces lub wszystkie razem poniosą porażkę.
  • COMMIT powoduje trwałe zmiany, a ROLLBACK je anuluje.
  • ACID oznacza atomowość, spójność, izolację i trwałość.
  • Silniejsza izolacja zapobiega większej liczbie anomalii, ale może zmniejszyć współbieżność, dlatego wybieraj świadomie.

Przeniesienie 300 rupii z Ashy na Bena wymaga dwóch aktualizacji: odjęcia z jednego konta i dodania do drugiego. Jeśli system między nimi zawiedzie, pieniądze znikną. Transakcje SQL uniemożliwiają to, traktując oba kroki jako pojedynczą jednostkę.

W tym przewodniku omawiamy zatwierdzenia, wycofywania zmian i niepowodzenia w małej tabeli kont. Uruchomiliśmy te przykłady w SQLite i pokazane salda pochodzą z tego uruchomienia. Podstawowe polecenia są podobne w różnych bazach danych, ale zachowanie blokowania i izolacji znacznie się różni, dlatego wskazujemy, gdzie można sprawdzić dokumentację własnej bazy danych.

Co to jest transakcja?

Transakcja to sekwencja jednej lub większej liczby instrukcji SQL, które baza danych traktuje jako pojedynczą operację logiczną. Oto nasza tabela:

CREATE TABLE accounts (
  id INT PRIMARY KEY,
  owner TEXT,
  balance INT CHECK (balance >= 0)
);

INSERT INTO accounts VALUES (1, 'Asha', 1000), (2, 'Ben', 200);

Ograniczenie CHECK to zasada mówiąca, że saldo nigdy nie może spaść poniżej zera, z której skorzystamy później. Należy zauważyć, że składnia rozpoczęcia transakcji jest różna: SQLite i PostgreSQL akceptują BEGIN, MySQL ma również START TRANSACTION, a SQL Server używa BEGIN TRANSACTION.

Poza jawną transakcją większość baz danych korzysta z opcji autocommit, w której każda instrukcja jest zapisywana zaraz po jej zakończeniu. Oracle jest godnym uwagi wyjątkiem, ponieważ tamtejsza sesja pozostaje częścią transakcji do czasu zatwierdzenia.

COMMIT: uczyń to trwałym

BEGIN;
UPDATE accounts SET balance = balance - 300 WHERE id = 1;
UPDATE accounts SET balance = balance + 300 WHERE id = 2;
COMMIT;

-- Asha | 700
-- Ben  | 500

Dopóki COMMIT nie zostanie uruchomiony, zmiany mają charakter tymczasowy. Po pomyślnym powrocie baza danych gwarantuje, że zostaną one zapisane. Suma na obu kontach pozostała na poziomie 1200 i na tym właśnie polega cały cel tego ćwiczenia.

ROLLBACK: anuluj wszystko

ROLLBACK cofa wszystko od rozpoczęcia transakcji:

BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
SELECT owner, balance FROM accounts;
-- Asha | 600   (visible inside this transaction)
-- Ben  | 500

ROLLBACK;
SELECT owner, balance FROM accounts;
-- Asha | 700   (back to where it was)
-- Ben  | 500

Wycofywanie następuje również automatycznie, jeśli połączenie zostanie zerwane lub serwer ulegnie awarii przed zatwierdzeniem, więc w połowie ukończona transakcja nie przetrwa.

Gdy wypowiedź się nie powiedzie

Oto bardziej realistyczny przypadek. Asha próbuje wysłać 5000, ale na koncie nie ma. Najpierw uruchamiany jest kredyt dla Bena, a następnie debet łamie regułę CHECK:

BEGIN;
UPDATE accounts SET balance = balance + 5000 WHERE id = 2;
UPDATE accounts SET balance = balance - 5000 WHERE id = 1;
-- error: CHECK constraint failed: balance >= 0

ROLLBACK;

-- Asha | 700
-- Ben  | 500

Bez transakcji Ben zatrzymałby 5000, a księgi byłyby błędne. Należy pamiętać o jednym ważnym szczególe: brak oświadczenia nie zawsze sam w sobie anuluje transakcję. Na przykład w SQLite i MySQL wcześniejsze instrukcje mogą pozostać w toku, więc Twój kod musi wywołać wycofanie. Zamiast tego PostgreSQL oznacza całą transakcję jako przerwaną i odmawia dalszych instrukcji, dopóki nie wycofasz.

W kodzie aplikacji zawsze łącz transakcję z obsługą błędów. Oto pomysł w Pythonie, a nasz przewodnik po obsłudze wyjątków w Pythonie wyjaśnia składnię:

try:
    conn.execute("BEGIN")
    conn.execute(debit_sql, values)
    conn.execute(credit_sql, values)
    conn.execute("COMMIT")
except Exception:
    conn.execute("ROLLBACK")
    raise

Punkty zapisu

Punkt zapisu oznacza pozycję wewnątrz transakcji, dzięki czemu można cofnąć tylko część pracy:

BEGIN;
UPDATE accounts SET balance = balance - 50 WHERE id = 1;
SAVEPOINT bonus;
UPDATE accounts SET balance = balance + 999 WHERE id = 2;
ROLLBACK TO bonus;
UPDATE accounts SET balance = balance + 50 WHERE id = 2;
COMMIT;

-- Asha | 650
-- Ben  | 550

Premia 999 została cofnięta, natomiast reszta transakcji została kontynuowana i zatwierdzona. Jest to przydatne w przypadku opcjonalnych etapów długiego procesu.

Wyjaśniono właściwości kwasu

Własność Obietnica W naszym transferze
Atomowość Wszystko albo nic Obie aktualizacje mają miejsce lub żadna z nich nie występuje
Spójność Później zasady nadal obowiązują Żadna równowaga nie może złamać reguły CHECK.
Izolacja Równoczesna praca nie przeszkadza Inni nie widzą w połowie ukończonego transferu
Trwałość Zatwierdzone dane przetrwają awarię Odcięcie zasilania po COMMIT nic nie powoduje

Spójność jest powszechnie źle rozumiana. Baza danych wymusza tylko zadeklarowane przez Ciebie reguły, takie jak ograniczenia i klucze obce. Nie powstrzyma to Twojego kodu przed przesłaniem niewłaściwej kwoty. Trwałość zwykle osiąga się za pomocą dziennika zapisu z wyprzedzeniem, w którym zmiany są bezpiecznie rejestrowane na dysku przed potwierdzeniem zatwierdzenia.

Co się dzieje w przypadku jednoczesnych transakcji?

Otworzyliśmy dwa połączenia z jednym plikiem SQLite. Pierwszy rozpoczął transakcję i zaktualizował wiersz z 1 do 2, jeszcze bez zatwierdzania. Oto co zobaczyło drugie połączenie:

Connection B reads:   1                     -- no uncommitted data
Connection B writes:  database is locked    -- it has to wait
(A commits)
Connection B reads:   2                     -- now it sees the change

SQLite umożliwia jednoczesne zapisywanie tylko jednego zapisu, co jest prostsze niż bazy danych serwera, w których wiele transakcji może jednocześnie zapisywać różne wiersze. Zasada jest jednak taka sama: przy normalnych ustawieniach inne sesje nie powinny widzieć niezatwierdzonych zmian, a zapisy powodujące konflikt muszą poczekać. W naszym teście drugie połączenie ustawiliśmy tak, aby natychmiast się poddawało, a nie czekało, więc błąd pojawił się od razu.

Przeczytaj anomalie

Kiedy transakcje nakładają się na siebie, mogą wystąpić pewne problemy. Standard SQL definiuje je w kategoriach tego, co może zaobserwować transakcja:

Anomalia Co się stanie
Brudna lektura Odczytałeś zmianę, której nie zatwierdziła inna transakcja, i która może zostać później wycofana
Niepowtarzalny odczyt W jednej transakcji czytasz wiersz dwa razy i otrzymujesz różne wartości, ponieważ ktoś popełnił błąd w międzyczasie
Czytanie fantomowe Uruchamiasz to samo zapytanie dwa razy i otrzymujesz dodatkowe lub brakujące wiersze, ponieważ ktoś je dodał lub usunął

Kolejnym problemem jest utracona aktualizacja. Dwie sesje odczytują saldo 100, każda dodaje 10 i każda zapisuje 110. Jedna aktualizacja faktycznie zniknęła, podczas gdy odpowiedź powinna wynosić 120.

Poziomy izolacji SQL

Poziomy izolacji pozwalają zamienić ścisłość na współbieżność. Oto, na co pozwala standard SQL na każdym poziomie:

Poziom Brudna lektura Niepowtarzalny odczyt Czytanie fantomowe
Przeczytaj niezatwierdzone Możliwe Możliwe Możliwe
Przeczytaj zaangażowany Zapobiegnięto Możliwe Możliwe
Powtarzalny odczyt Zapobiegnięto Zapobiegnięto Możliwe
Możliwość serializacji Zapobiegnięto Zapobiegnięto Zapobiegnięto
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

Dokładna składnia i zachowanie zależą od bazy danych. Wartości domyślne również się różnią: PostgreSQL i SQL Server korzystają z zatwierdzonego odczytu, podczas gdy InnoDB MySQL używa powtarzalnego odczytu. Niektóre bazy danych dają silniejsze gwarancje niż wymaga tego standard lub traktują jeden poziom jako drugi. Na przykład w PostgreSQL odczyt niezatwierdzony zachowuje się jak odczyt zatwierdzony. Zawsze czytaj dokumentację bazy danych, zanim zaczniesz polegać na konkretnym zachowaniu.

Wskazówka: W przypadku utraconej aktualizacji wprowadź zmianę w jednej instrukcji, jak w UPDATE accounts SET balance = balance + 10. Wykonanie obliczeń w aplikacji na podstawie wcześniejszej lektury otwiera lukę.

Zakleszczenia

Zakleszczenie ma miejsce, gdy dwie transakcje zawierają blokadę, której potrzebuje druga. Transakcja A blokuje wiersz 1 i chce wiersza 2, podczas gdy transakcja B blokuje wiersz 2 i chce wiersza 1. Żadna z nich nie może być kontynuowana.

Bazy danych takie jak PostgreSQL, MySQL i SQL Server wykrywają to i anulują jedną transakcję z błędem. Jest to normalne zachowanie i Twoja aplikacja powinna być na to przygotowana. Aby ograniczyć zakleszczenia, zawsze aktualizuj wiersze w spójnej kolejności, np. najpierw najniższy identyfikator konta, dbaj o krótkie transakcje i spróbuj ponownie, gdy któreś z nich zostanie wybrane jako ofiara.

Najlepsze praktyki

  • Trzymaj krótkie transakcje. Długie blokują blokady i blokują innych użytkowników.
  • Nigdy nie czekaj na użytkownika lub powolny interfejs API w ramach transakcji. Wykonaj tę pracę przed rozpoczęciem lub później.
  • Zawsze obsługuj niepowodzenie. Każda ścieżka powinna kończyć się zatwierdzeniem lub wycofaniem.
  • Dodaj ograniczenia. Dają one bazie danych rzeczywiste reguły do ​​egzekwowania. Dobry projekt stołu też pomaga.
  • Używaj dobrych indeksów. Szybsze wyszukiwanie oznacza, że ​​blokady są utrzymywane krócej.
  • Uważaj przy ponawianiu prób. Ponów próbę w przypadku zakleszczenia, ale upewnij się, że operacja nie może zostać zastosowana dwukrotnie.
  • Celowo przetestuj współbieżność. Wiele z tych błędów pojawia się tylko pod obciążeniem, więc same testy integracyjne mogą ich nie wykryć.

Podsumowanie

Transakcje zamieniają kilka ryzykownych kroków w jedną bezpieczną operację, a ACID opisuje gwarancje, które czynią tę operację wiarygodną. Ilekroć działanie biznesowe dotyka więcej niż jednego wiersza lub tabeli, zadaj sobie pytanie, co by się stało, gdyby zatrzymało się w połowie. Jeśli odpowiedź Cię niepokoi, zapakuj ją w transakcję. Aby poćwiczyć, otwórz dwie sesje w lokalnej bazie danych i spróbuj samodzielnie wygenerować anomalie.

Najczęstsze pytania

Co to jest transakcja w SQL?

Transakcja to grupa instrukcji SQL traktowana jako jedna jednostka. Albo wszystkie zostaną zapisane za pomocą COMMIT, albo wszystkie zostaną cofnięte za pomocą ROLLBACK.

Jakie są właściwości ACID w bazie danych?

ACID oznacza atomowość, spójność, izolację i trwałość. Razem zapewniają, że transakcje są typu „wszystko albo nic”, utrzymują zasady w nienaruszonym stanie, nie ingerują i przetrwają awarie.

Jaka jest różnica między COMMIT i ROLLBACK?

COMMIT trwale zapisuje wszystkie zmiany dokonane w transakcji. ROLLBACK anuluje je i przywraca dane do stanu sprzed rozpoczęcia transakcji.

Co to jest brudna lektura?

Z brudnym odczytem mamy do czynienia wtedy, gdy jedna transakcja odczytuje zmiany, których inna jeszcze nie zatwierdziła. Jeśli ta inna transakcja zostanie wycofana, odczytane dane tak naprawdę nigdy nie istniały.

Jakiego poziomu izolacji powinienem użyć?

Zacznij od domyślnej bazy danych, która zwykle jest w porządku. Użyj możliwości serializacji w przypadku logiki krytycznej, gdzie anomalie są niedopuszczalne, i przygotuj się na ponowienie nieudanych transakcji.

Ucz się dalej

Pracuj z Stack Quora

Potrzebujesz pomocy przy testowaniu, WordPressie lub SEO?

Pomagamy zespołom dostarczać lepsze oprogramowanie i rozwijać ich witryny. Powiedz nam, nad czym pracujesz, a my zaproponujemy jasny następny krok.

Czytaj dalej

Więcej poradników na testowanie, sztuczna inteligencja i nowoczesny rozwój

Podobał Ci się ten artykuł? Wybierz temat i przejdź bezpośrednio do naszych najnowszych tutoriali.

Sztuczna inteligencja

Wyjaśnienie halucynacji AI: dlaczego modele językowe tworzą rzeczy i jak je zmniejszyć

Wyjaśniono halucynacje AI: czym są, dlaczego powstają w modelach językowych, typowe typy, jak je zredukować za pomocą uziemień i podpowiedzi oraz pr…

Przeczytaj artykuł →
DevOps

Wyjaśnienie zmiennych środowiskowych: pliki .env, sekrety i konfiguracja wykonana prawidłowo

Zmienne środowiskowe wyjaśnione na przykładach Pythona, które przeprowadziliśmy: ich odczytywanie i ustawianie, dlaczego każda wartość jest ciągiem …

Przeczytaj artykuł →
Tworzenie oprogramowania

Wyjaśnienie ograniczenia szybkości interfejsu API: algorytmy, nagłówki i obsługa błędów 429

Ograniczanie szybkości API wyjaśnione za pomocą przeprowadzonej przez nas symulacji: zasobnik tokenów, stałe okno, przesuwane okno, 429 odpowiedzi, …

Przeczytaj artykuł →
Automatyzacja testów

Wyśmiewanie w Pythonie: unittest.mock, patch i błędy, które sprawiają, że testy kłamią

Wyśmiewanie w Pythonie za pomocą unittest.mock, przetestowane: Mock i zwracana wartość, efekt uboczny, łatanie tam, gdzie używana jest nazwa, specyf…

Przeczytaj artykuł →
Testowanie oprogramowania

Wyjaśnienie zasięgu kodu: pokrycie linii i oddziału oraz co naprawdę oznacza 100%

Wyjaśnienie pokrycia kodu za pomocą prawdziwego pliku cover.py: pokrycie linii, gałęzi i warunków, przeczytanie raportu, dlaczego 100% pokrycia może…

Przeczytaj artykuł →
Bazy danych i SQL

DELETE vs TRUNCATE vs DROP w SQL: różnice, wycofywanie i kiedy używać każdego z nich

DELETE vs TRUNCATE vs DROP wyjaśnione za pomocą przetestowanego SQL: co każdy usuwa, wycofywanie, wyzwalacze, resetowanie tożsamości, prędkość i czy…

Przeczytaj artykuł →
Bazy danych i SQL

Wyjaśnienie widoków SQL: tworzenie, używanie i unikanie pułapek wraz z przykładami

Widoki SQL wyjaśnione za pomocą zapytań, które uruchomiliśmy: tworzenie widoku, wyniki na żywo, ukrywanie kolumn, wydajność, widoki z możliwością ak…

Przeczytaj artykuł →
Tworzenie oprogramowania

Interfejs TypeScript a typ: rzeczywiste różnice, testowane za pomocą kompilatora

Interfejs TypeScript a typ, sprawdzony z prawdziwym kompilatorem: co oba mogą zrobić, co tylko jeden, łączenie deklaracji, rozszerzenia a przecięcia…

Przeczytaj artykuł →
Tworzenie oprogramowania

Python *args i **kwargs wyjaśnione: elastyczne funkcje z przejrzystymi przykładami

Python *args i **kwargs wyjaśnione za pomocą uruchomionego przez nas kodu: pakowanie i rozpakowywanie, kolejność parametrów, argumenty zawierające t…

Przeczytaj artykuł →
Tworzenie oprogramowania

Funkcje Lambda w Pythonie: składnia, rzeczywiste zastosowania i kiedy ich nie używać

Funkcje lambda w Pythonie wyjaśnione za pomocą uruchomionego przez nas kodu: składnia, sortowanie za pomocą klucza, mapa i filtr, domknięcia, pułapk…

Przeczytaj artykuł →
Sztuczna inteligencja

Kim są agenci AI? Jak one działają, dzięki prostej pętli agenta, którą możesz uruchomić

Kim są agenci AI? Prosty przewodnik po pętli agenta, narzędziach, pamięci i poręczach, z małą pętlą w Pythonie, którą uruchomiliśmy, prawdziwymi zag…

Przeczytaj artykuł →
DevOps

Monitorowanie a obserwowalność: prawdziwa różnica z logami, wskaźnikami i śladami

Wyjaśnienie monitorowania a obserwowalności: znane i nieznane awarie, dzienniki, metryki i ślady, opis incydentu przy kasie, złote sygnały, OpenTele…

Przeczytaj artykuł →
DevOps

Woluminy platformy Docker a mocowania powiązań: utrwalanie danych kontenera we właściwy sposób

Wyjaśniono woluminy Dockera a montowanie powiązań: dlaczego dane kontenera znikają, nazwane woluminy, montowanie powiązań, tmpfs, przykłady tworzeni…

Przeczytaj artykuł →
Automatyzacja testów

TDD vs BDD: kluczowe różnice, jedna funkcja zbudowana w obie strony i kiedy używać każdej z nich

TDD vs BDD wyjaśnione za pomocą jednej funkcji rabatowej zbudowanej w obie strony: refaktoryzacja czerwono-zielona z uruchomionym przez nas kodem, s…

Przeczytaj artykuł →
Testowanie oprogramowania

Testowanie akceptacyjne użytkownika (UAT): proces, lista kontrolna i rzeczywiste przykłady

Wyjaśniono testy akceptacyjne użytkownika: kto je przeprowadza, czym różni się od kontroli jakości, siedmioetapowy proces, szablon przypadku testowe…

Przeczytaj artykuł →
Bazy danych i SQL

Wyjaśnienie wartości SQL NULL: IS NULL, COALESCE, NULLIF i pułapki, których należy unikać

Wartości SQL NULL wyjaśnione za pomocą zapytań, które wykonaliśmy: logika trójwartościowa, IS NULL, COALESCE, NULLIF, w jaki sposób agregacje, łącze…

Przeczytaj artykuł →
Bazy danych i SQL

Instrukcja SQL CASE WHEN: składnia, rzeczywiste przykłady i typowe błędy

SQL CASE WHEN wyjaśnione za pomocą zapytań, które uruchomiliśmy: proste i przeszukiwane formularze, kolejność warunków, elementy przestawne z SUM, s…

Przeczytaj artykuł →
Tworzenie oprogramowania

Co to jest JWT? Tokeny internetowe JSON wyjaśnione na przykładzie działania

Co to jest JWT? Wyjaśniono tokeny sieciowe JSON: trzy części, token zbudowany i zmodyfikowany w uruchomionym przez nas kodzie, JWT a sesje, pamięć m…

Przeczytaj artykuł →
Tworzenie oprogramowania

Wyjaśnienie pętli zdarzeń JavaScript: stos wywołań, mikrozadania i liczniki czasu z przykładami

Pętla zdarzeń JavaScript wyjaśniona za pomocą uruchomionego przez nas kodu: stos wywołań, kolejki zadań i mikrozadań, dlaczego setTimeout 0 nie jest…

Przeczytaj artykuł →
Tworzenie oprogramowania

Wyjaśnienie generatorów Pythona i wydajności: oszczędzaj pamięć dzięki prawdziwym przykładom

Generatory Pythona i wydajność wyjaśnione za pomocą uruchomionego przez nas kodu: sposób wstrzymywania i wznawiania, mierzone oszczędności pamięci, …

Przeczytaj artykuł →
Sztuczna inteligencja

Czym są osady? Wyjaśnienie wektorów i podobieństwa cosinusa

Czym są osadzania? Prosty przewodnik po wektorach, podobieństwie cosinusów i wyszukiwaniu semantycznym, z małym przykładem, który przeprowadziliśmy,…

Przeczytaj artykuł →
DevOps

Wdrożenie niebiesko-zielone a kanaryjskie: różnice, kompromisy i sposób wyboru

Wyjaśniono wdrożenie Blue-Green vs Canary: sposób działania każdego z nich, koszty, ryzyko i wycofywanie zmian, przetestowane przez nas stabilne łąc…

Przeczytaj artykuł →
Automatyzacja testów

Niestabilne testy: co je powoduje i jak je naprawić na dobre

Niestabilne testy wyjaśnione w przeprowadzonych przez nas demonstracjach: główne przyczyny, sposób potwierdzenia i zdiagnozowania jednej z nich, odp…

Przeczytaj artykuł →
Testowanie oprogramowania

Load Testing vs Stress Testing: Differences, Metrics and k6 Examples

Wyjaśniono testy obciążenia i testy warunków skrajnych: co dowodzi każdy z nich, testy szczytowe i nasiąkania, istotne metryki, dlaczego średnie wpr…

Przeczytaj artykuł →
Testowanie oprogramowania

Przypadek testowy a scenariusz testowy: kluczowe różnice, przykłady i kiedy stosować każdy z nich

Wyjaśnienie przypadków testowych i scenariuszy testowych: jasne definicje, tabela obok siebie, jedna funkcja resetowania hasła zaczerpnięta ze scena…

Przeczytaj artykuł →
Bazy danych i SQL

Optymalizacja zapytań SQL: czytaj plany wykonania i napraw powolne zapytania z synchronizacją

Optymalizacja zapytań SQL przetestowana na milionie wierszy: przeczytaj plany wykonania, dodaj odpowiednie indeksy, napraw filtry niesargowalne, uży…

Przeczytaj artykuł →
Bazy danych i SQL

SQL UNION vs UNION ALL: różnice, przykłady i testowana wydajność

SQL UNION vs UNION ALL wyjaśnione na podstawie zapytań, które uruchomiliśmy: duplikaty, obie reguły są zgodne, prawdziwy błąd danych, zmierzona wyda…

Przeczytaj artykuł →
Tworzenie oprogramowania

Samouczek API pobierania JavaScript: GET, POST, obsługa błędów i limity czasu

Samouczek JavaScript Fetch API testowany na serwerze lokalnym: GET i POST, dlaczego 404 nie rzuca, pomocnik wielokrotnego użytku, ciągi zapytań, prz…

Przeczytaj artykuł →
Tworzenie oprogramowania

Obsługa plików w Pythonie: odczyt, zapis, CSV, JSON i pathlib z przykładami

Obsługa plików w Pythonie wyjaśniona za pomocą uruchomionego przez nas kodu: tryby otwarte, czytanie dużych plików, CSV, JSON, pathlib, pliki binarn…

Przeczytaj artykuł →
Tworzenie oprogramowania

Klasy i obiekty Pythona: samouczek OOP z prawdziwymi przykładami

Klasy i obiekty Pythona objaśnione za pomocą uruchomionego przez nas kodu: __init__, metody, atrybuty klas i instancji, dziedziczenie, właściwości, …

Przeczytaj artykuł →
Sztuczna inteligencja

Co to jest model dużego języka? Jak działają LLM, wyjaśnione bez szumu

Co to jest model dużego języka? LLM wyjaśnione prostym językiem: tokeny, osadzanie, uwaga, szkolenie, temperatura i okna kontekstowe, mała demonstra…

Przeczytaj artykuł →
DevOps

Polecenia systemu Linux dla początkujących: niezbędny przewodnik po terminalu z przykładami

Polecenia systemu Linux dla początkujących, pogrupowane według zadań: nawigacja, pliki, przeglądanie logów, grep, potoki, uprawnienia, procesy i arc…

Przeczytaj artykuł →
Automatyzacja testów

Selenium kontra dramaturg: kluczowe różnice, porównanie kodu i wybór

Porównanie Selenium i Playwright: architektura, oczekiwanie, obsługa przeglądarki i języka, debugowanie, ten sam test w obu narzędziach, porady doty…

Przeczytaj artykuł →
Testowanie oprogramowania

Partycjonowanie równoważne: technika projektowania testów wyjaśniona na praktycznych przykładach

Wyjaśniono podział równoważny: jak znaleźć prawidłowe i nieprawidłowe partycje, sprawdzone przykłady dla grup wiekowych, hasła i kupony, przeprowadz…

Przeczytaj artykuł →
Testowanie oprogramowania

Ważność a priorytet w testowaniu oprogramowania: różnice, macierz i rzeczywiste przykłady

Wyjaśniono ważność a priorytet w testowaniu oprogramowania: jasne definicje, czterokierunkowa macierz z przykładami, skale poziomów, kto ustawia każ…

Przeczytaj artykuł →
Bazy danych i SQL

Samouczek dotyczący podzapytań SQL: typy, skorelowane podzapytania i ISTNIEJĄ z przykładami

Samouczek dotyczący podzapytań SQL z zapytaniami, które wykonaliśmy: podzapytania skalarne, IN, FROM i SELECT, podzapytania skorelowane, EXISTS, puł…

Przeczytaj artykuł →
Bazy danych i SQL

Wyjaśnienie transakcji SQL i ACID: COMMIT, ROLLBACK i poziomy izolacji

Transakcje SQL i ACID wyjaśnione za pomocą wykonanego przez nas przelewu bankowego: COMMIT, ROLLBACK, punkty zapisu, blokady, poziomy izolacji, brud…

Przeczytaj artykuł →
Tworzenie oprogramowania

Git merge vs rebase: różnice, przykłady i kiedy czego używać

Git merge vs rebase wyjaśnione na prawdziwym wyniku logu, z tabelą porównawczą, złotą zasadą rebase i bezpiecznym procesem pracy zespołu.

Przeczytaj artykuł →
Tworzenie oprogramowania

Python list comprehension: składnia, przykłady i kiedy jej unikać

Python list comprehension wyjaśnione: składnia, filtrowanie, if-else, zagnieżdżone pętle, zmierzone czasy i sytuacje, w których zwykła pętla for jes…

Przeczytaj artykuł →
Bazy danych i SQL

SQL JOIN – wyjaśnienie z przykładami (Inner, Left, Right, Full)

Zrozum złączenia SQL krok po kroku na przykładowych tabelach i zapytaniach: INNER, LEFT, RIGHT, FULL, CROSS i SELF, plus typowe błędy i wskazówki wy…

Przeczytaj artykuł →