SQL szerver tranzakciókezelés
Az SQL Server tranzakcióinak kezelése fontos lépés a folyamatos működés biztosításához, és a zárolásokkal kapcsolatos hibák elkerülésének módja.
Glenn Berry, Louis Davidson és Tim Ford
Végül az SQL Serverben végrehajtott összes utasítás tranzakció. Ha még egy SQL-utasítást hajt végre "a motorháztető alatt", implicit tranzakciót kezdeményez. Megkezdődik és automatikusan befejeződik. Amikor a BEGIN TRAN és a COMMIT TRAN parancsokat használjuk, azokat explicit műveletekké, azaz utasítások készletévé alakíthatjuk, amelyeket mindenki vagy sem kell végrehajtania.
Az SQL Server különböző tranzakcióelkülönítési szinteket valósít meg annak érdekében, hogy biztosítsa a tranzakció tulajdonságait, például atomicitást, konzisztenciát, elszigeteltséget és hosszú élettartamot (ACID). A gyakorlatban ez azt jelenti, hogy hosszú és rövid távú zárolásokat használnak annak érdekében, hogy tranzakciós hozzáférést biztosítsanak egy közös adatbázishoz, és megakadályozzák a tranzakciók zavarását egymással.
Általánosságban elmondható, hogy az SQL Server tranzakciók kutatásának és kezelésének stratégiája és kezelése néhány kulcskérdésre korlátozható:
- Mely aktív tranzakciók és milyen nyitott munkamenetek vannak? (adminisztratív ábrázolások a következő szavakkal: session_transactions, active_transactions)
- Mely tranzakciók teszik a legtöbb munkát? (adminisztratív ábrázolások a database_transactions szavakkal)
- Milyen tranzakciók okoznak zárolási problémákat? (adminisztratív nézetek a zárójelekkel).
A "hosszú játék" ügyletek nyomon követése
A második, sys.dm_tran_session_transactions "visszaadja a kapcsolódó ügyletek és munkamenetek kapcsolatairól szóló információkat".
Tömör leírás sys.dm_tran_database_transactions elrejteni több mint leírni a valódi hasznosságát ez az ábrázolás. A következő script tartalmaz lekérdezést, amely megmutatja az egyes ülésén, amely adatbázisokat használnak egy adott tranzakció, nyissa meg ezt a munkamenet, hogy az ügylet került át a csak olvasható állapotban bármelyik adatbázisok (alapértelmezés szerint a legtöbb tranzakció csak olvasható) , amikor történt, hogy hány bejegyzést regisztráltak, és hány bájtot vettek be ezekbe a bejegyzésekbe a naplóban:
SELECT st.session_id. DB_NAME (dt.database_id) AS adatbázisnév. CASE WHEN dt.database_transaction_begin_time IS NULL THEN "csak olvasható"
ELSE "olvasás-írás" END AS transaction_state. dt.database_transaction_begin_time AS read_write_start_time. dt.database_transaction_log_record_count. dt.database_transaction_log_bytes_usedFROM sys.dm_tran_session_transactions Szent inner join sys.dm_tran_database_transactions AS dt
ON st.transaction_id = dt.transaction_idORDER BY st.session_id. database_name
Az ilyen sys.dm_tran_database_transactions benyújtási kérelmek nagyon hasznosak olyan dolgok megfigyeléséhez, mint például:
- Nyitott, csak olvasható műveletekkel rendelkező munkamenetek (ez különösen fontos az "alvó" foglalkozásoknál).
- A tranzakciós napló ellenőrzött növekedését eredményező munkamenetek.
- A "hosszú játék" tranzakciókban (a nem teljes naplózást nem igénylő műveletek esetében az egyik érintett indexsor egy tranzakciónapló bejegyzést hoz létre).
Normál és rövid távú zár
A mintaprotézisünkben a dinamikus nézet sys.dm_tran_locks, amelyet tranzakciókkal és az elektronikus dokumentációban ismertetünk, a következőképpen működik: "Az aktuálisan aktivált zároláskezelő erőforrásával kapcsolatos információkat jeleníti meg. Mindegyik sor a zároláskezelő aktuális aktuális kérését jelöli a fogadott fogadtatás vagy a vétel időpontjában. Az eredménykészlet oszlopai két csoportra oszthatók: egy erőforrás és egy lekérdezés. Az erőforráscsoport azokat a forrásokat írja le, amelyekhez a zárolási kérelmet készítették, és a lekérdezési csoport leírja a zárolási kérelmet. "
Ez az adminisztratív nézet hasznos az adatbázis-példány zárolásaival kapcsolatos problémák azonosításához:
-- Tekintse meg az aktuális Lock Manager erőforrásokat az aktuális adatbázis számára
DB_NAME (resource_database_id) AS [adatbázis]. resource_type. resource_subtype. request_type. request_mode. resource_description. request_mode. request_owner_type
FROM sys.dm_tran_locksWHERE request_session_id> 50 ÉS resource_database_id = DB_ID () ÉS request_session_id <> @@ SPIDORDER BY request_session_id;
-- Keresse meg a blokkolást
SELECT tl.resource_type. tl.resource_database_id. tl.resource_associated_entity_id. tl.request_mode. tl.request_session_id. wt.blocking_session_id. wt.wait_type. wt.wait_duration_msFROM sys.dm_tran_locks AS tl inner join sys.dm_os_waiting_tasks AS WT tl.lock_owner_address = wt.resource_addressORDER BY wait_duration_ms DESC;
Az első lekérdezés a zárolási típusok listáját és azok állapotát jelöli az egy adatbázisra kiválasztott SPID-ok alapján, a jelenlegi SPID-kapcsolattal és rendszerazonosítóval együtt. A második lekérdezés tájékoztatást nyújt a példány összes zárolásáról. Ne feledje, hogy a második kérés a sys.dm_os_waiting_tasks nézethez kapcsolódik, hogy adatokat szerezzen a folyamat várakozásainak hosszáról a zárolások miatt, és mely erőforrás miatt.
Általában annak érdekében, hogy "elkapjanak" egy zárat, többször is végre kell hajtanod ezeket a kéréseket. Ha úgy találja, a két adatmódosítás utasítás vagy lekérdezés és módosítani az adatokat, amelyeket „összefonódnak” egy szűk, vagy akár holtpont, akkor kell kivonat szövegét SQL-lekérdezések, elemzi őket, hogy végre egy teszt rendszer (bekapcsolt nyomkövetés által Profiler), és oldja meg a problémát, lekérdezések módosítása vagy indexek hozzáadása.
Glenn Berry adatbázisfejlesztőként dolgozik a NewsGator Technologies-ban Denverben, Columbia-ben. Ő a címe MVP SQL Server, és egy sor Microsoft minősítések, beleértve MCITP, MCDBA, MCSE, MCSD, MCAD és az MCT, ami azt jelenti, hogy ő nagyon szereti, hogy a minősítő vizsga.
Louis Davidson (Louis Davidson) már több mint 16 éve dolgozik az informatikai területen a vállalati adatbázisok fejlesztőjeként és építészeként. Hat évig az SQL Server MVP címet viselte, és négy könyvet írt az adatbázis tervezéséről. Ő jelenleg részt vesz a fejlesztési adatbázis architektúra és adatbázis adminisztráció egy kicsit Christian Broadcasting Network, munkájának támogatása az ágak a város Virginia Beach, Virginia, és a város a Nashville, Tennessee.