Windows - Összefűzött kapcsolatok az SQL szerverben

Az összefűzött (bound) kapcsolatok lehetővé teszik, hogy kettő vagy több kapcsolat megossza ugyanazt a tranzakciót, valamint a zárolásokat. Az összefűzött kapcsolatok képesek ugyanazokkal az adatokkal dolgozni zárolási konfliktusok nélkül. Létrejöhetnek több kapcsolatból ugyanazon az alkalmazáson belül, vagy több alkalmazásból, elkülönített kapcsolatokból. Az összefűzött kapcsolatok sokkal könnyebbé teszik a műveleteket több kapcsolat között.
Ahhoz, hogy résztvevők legyünk egy összefűzött kapcsolatban, meg kell hívni az sp_getbindtoken-t vagy az srv_getbindtoken-t (Open Data Services), hogy összekötő jelölést kapjunk. Az összekötő jelölés egy karakteres sztring, amely egyedileg azonosít minden összefűzött kapcsolatot. Az összekötő jelölés ezután elküldésre kerül a másik kapcsolathoz, így megosztozva az összefűzött kapcsolatban. A másik kapcsolat összeköttetésbe kerül a tranzakcióval, meghívva az sp_bindsession-t, felhasználva az első kapcsolattól kapott összekötő jelölést.
Az összekötő jelöléseket az alkalmazás kódból kell átvinni, amely az első kapcsolatot létrehozta, elkészítve bármilyen későbbi összefűzött kapcsolatot. Nincs olyan Transact-SQL utasítás, vagy API függvény, amelyet egy alkalmazás használhatna, hogy összekötő jelölést kapjon egy mások folyamat által létrehozott tranzakcióhoz. Néhány módszer, amely arra használható, hogy átvigyünk összekötő jelöléseket:
  • Ha a kapcsolatok ugyanabból az alkalmazásfolyamatból származnak, akkor az összefűző jelölések a globális memóriában tárolódhatnak, vagy paraméterként átadódhatnak függvényeknek.
  • Ha a kapcsolatok különböző alkalmazásfolyamatokból származnak, akkor az összefűző jelölések átadásra kerülhetnek folyamatközti kommunikációban (IPC), mint amilyen egy távoli eljáráshívás (RPC), vagy dinamikus adatcsere (DDE).
  • Összefűző kapcsolatok tárolódhatnak egy SQL szerver táblában, amely olvasható azon folyamatok által, amelyek az első kapcsolattal akarnak összeköttetésbe lépni.
Csak egy kapcsolat lehet egyszerre aktív az összefűzött kapcsolatok közül. Ha egy kapcsolat utasítást futtat a szerveren, vagy éppen eredményt vár tőle, akkor nem léteznek olyan kapcsolatok, amelyek megosztanák azt a tranzakciót, amely képes elérni a szervert, mielőtt az aktuális kapcsolat befejezné a parancs futtatását, vagy leállítaná azt. Ha a szerver foglalt, akkor egy hiba jelenik meg, jelezve, hogy a tranzakciós hely használatban van, és a kapcsolat később újra próbálkozik.
Összefűzött kapcsolatok típusai
Az összefűzött kapcsolatok két típusa lehet helyi vagy elosztott.
  • Helyi összefűzött kapcsolat
Lehetővé teszi, hogy összefűzzünk kapcsolatokat, megosztva a tranzakciós területét egy egyedi tranzakciónak egy egyedülálló szerveren.
  • Elosztott összefűzött kapcsolat
Lehetővé teszi, hogy összefűzzünk kapcsolatokat, megosztva ugyanazt a tranzakciót kettő vagy több szerver között, amíg az adott tranzakció akár jóváhagyott, akár visszagörgetett a Microsoft Distributed Transaction Coordinator (MS DTC) használatával.
Elosztott összefűzött kapcsolatok nem egy összekötést jelölő karakteres sztring segítségével azonosíthatók, hanem elosztott tranzakció azonosító számokkal. Ha egy összefűzött kapcsolat egy helyi tranzakción belül helyezkedik el és futtat egy RPC-t egy távoli szerveren a SET REMOTE_PROC_TRANSACTIONS ON segítségével, akkor a helyi összefűzött kapcsolat automatikusan előlép egy elosztott összefűzött kapcsolattá az MS DTC segítségével és a MS DTC session indul.
Mikor használjunk összefűzött kapcsolatokat
Az összefűzött kapcsolatok használhatók kiterjesztett tárolt eljárások fejlesztésénél, amikor a T-SQL utasításokat annak a folyamatnak a nevében kell futtatnunk, aki meghívta őket. A hívó folyamat birtokában adjunk át egy összekötő jelölést, mint a kiterjesztett tárolt eljárás egy paraméterét, lehetővé téve az eljárásnak, hogy kapcsolódjon a hívó folyamat tranzakciós területéhez, ezáltal integrálva a kiterjesztett tárolt eljárást a hívó folyamattal.
Összefűzött kapcsolatokat használhatunk három rétegű alkalmazások fejlesztésénél, ahol az üzleti gondolkodás külön programban jelenik meg, amely együttműködik egy egyedülálló üzleti tranzakcióval.
Az összefűzött kapcsolatok következő példája megmutatja, hogy két kapcsolat hogyan éri el ugyanazt a tranzakciót: Egy vásárló eldönti, hogy megvásárol egy terméket a helyi boltban. Az eladó elér egy értékesítési tranzakciós rendszert, amely beszúr egy sort az eladási tranzakció-táblába, amely tartalmaz egy bankkártya azonosító számot. Két kapcsolat épül fel ugyanahhoz a szerverhez, C1 és C2 kapcsolat. A C1 elindít egy tranzakciót, amely hozzáad egy termékeladási sort a termékeladási táblához. Egy bankkártya azonosító számot kell adni az új értékesítési tranzakciós sorhoz. A bankkártya azonosítási folyamat alatt a kiterjesztett tárolt eljárás létrehozza a C2-es kapcsolatot, hogy kihívjon egy telefonos vonalon a bankkártya bankjához, és módosítsa az eladási tranzakciós sort a bankkártya azonosító számmal. Csak az összefűzött kapcsolatoknak köszönhetően képes mindkét kapcsolat elérni ugyanazt a sort zárolási konfliktus nélkül.