Performing Transactions
03/02/2023
Belirli bir cache iรงin transaction desteฤi etkinleลtirilmesi iรงin, cache yapฤฑlandฤฑrmasฤฑnda atomicityMode parametresi TRANSACTIONAL olarak ayarlanabilir. Detaylฤฑ bilgi iรงin Atomicity Modes bรถlรผmรผne bakabilirsiniz.
Transactionlar, bir veya daha fazla keyโdeki birden รงok cache iลlemini tek bir atomik iลlemde gruplandฤฑrmaya olanak tanฤฑr. Bu iลlemler, belirtilen keylerde baลka serpiลtirilmiล iลlemler olmadan yรผrรผtรผlรผr ve ya tรผmรผ baลarฤฑlฤฑ olur ya da tรผmรผ baลarฤฑsฤฑz olur. ฤฐลlemlerin parรงalฤฑ olarak yรผrรผtรผlmesi sรถz konusu deฤildir.
Cache yapฤฑlandฤฑrmasฤฑnda belirli bir รถnbellek iรงin transactionlar etkinleลtirilebilir;
โจ๏ธ XML Config
<bean class="org.apache.ignite.configuration.IgniteConfiguration">
<property name="transactionConfiguration">
<bean class="org.apache.ignite.configuration.TransactionConfiguration">
<!--Set the timeout to 20 seconds-->
<property name="TxTimeoutOnPartitionMapExchange" value="20000"/>
</bean>
</property>
</bean>โจ๏ธ .NET Config
var cfg = new IgniteConfiguration
{
CacheConfiguration = new[]
{
new CacheConfiguration("txCache")
{
AtomicityMode = CacheAtomicityMode.Transactional
}
},
TransactionConfiguration = new TransactionConfiguration
{
DefaultTransactionConcurrency = TransactionConcurrency.Optimistic
}
};Executing Transactions
Key/Value API'si, transactionlarฤฑ baลlatma ve tamamlamanฤฑn yanฤฑ sฤฑra transaction ile ilgili metrikleri almak iรงin bir interface saฤlar. Interface, bir Ignite nesnesinden elde edilebilir.
โจ๏ธ .NET Sample
var cfg = new IgniteConfiguration
{
DiscoverySpi = new TcpDiscoverySpi
{
LocalPort = 48500,
LocalPortRange = 20,
IpFinder = new TcpDiscoveryStaticIpFinder
{
Endpoints = new[]
{
"127.0.0.1:48500..48520"
}
}
},
CacheConfiguration = new[]
{
new CacheConfiguration
{
Name = "cacheName",
AtomicityMode = CacheAtomicityMode.Transactional
}
},
TransactionConfiguration = new TransactionConfiguration
{
DefaultTimeoutOnPartitionMapExchange = TimeSpan.FromSeconds(20)
}
};
var ignite = Ignition.Start(cfg);
var cache = ignite.GetCache<string, int>("cacheName");
cache.Put("Hello", 1);
var transactions = ignite.GetTransactions();
using (var tx = transactions.TxStart())
{
int hello = cache.Get("Hello");
if (hello == 1)
{
cache.Put("Hello", 11);
}
cache.Put("World", 22);
tx.Commit();
}Concurrency Modes and Isolation Levels
TRANSACTIONAL atomicity moduna sahip cacheler, transactionlar iรงin hem OPTIMISTIC hem de PESSIMISTIC eลzamanlฤฑlฤฑk(concurrency) modlarฤฑnฤฑ destekler. Eลzamanlฤฑlฤฑk modu, giriล dรผzeyinde bir transaction kilidinin ne zaman alฤฑnacaฤฤฑnฤฑ belirler: veri eriลimi sฤฑrasฤฑnda veya hazฤฑrlฤฑk aลamasฤฑnda. Kilitleme, bir nesneye eลzamanlฤฑ eriลimi engeller. รrneฤin, pessimistic kilitleme ile bir ToDo list รถฤesini gรผncellemeye รงalฤฑลtฤฑฤฤฑnฤฑzda, siz transactionโu commitleyene veya rollback yapana kadar sunucu nesneye bir kilit yerleลtirir ve baลka hiรงbir iลlem veya iลlemin aynฤฑ giriลi gรผncellemesine izin verilmez. Bir transactionda kullanฤฑlan eลzamanlฤฑlฤฑk modundan baฤฤฑmsฤฑz olarak, transactionda listelenen tรผm giriลlerin committen รถnce kilitlendiฤi bir an vardฤฑr.
Izolasyon(isolation) dรผzeyi, eลzamanlฤฑ transactionlarฤฑn aynฤฑ keyler รผzerindeki iลlemleri nasฤฑl 'gรถrdรผฤรผnรผ' ve ele aldฤฑฤฤฑnฤฑ tanฤฑmlar. Ignite, READ_COMMITTED, REPEATABLE_READ ve SERIALIZABLE izolasyon seviyelerini destekler.
Eลzamanlฤฑlฤฑk modlarฤฑnฤฑn ve izolasyon dรผzeylerinin tรผm kombinasyonlarฤฑna izin verilir. Aลaฤฤฑda, sistem davranฤฑลฤฑnฤฑn aรงฤฑklamasฤฑ ve her bir eลzamanlฤฑlฤฑk-izolasyon kombinasyonu tarafฤฑndan saฤlanan garantiler yer almaktadฤฑr.
Pessimistic Transactions
PESSIMISTIC transactionlarda kilitler, ilk okuma veya yazma eriลimi sฤฑrasฤฑnda (izolasyon seviyesine baฤlฤฑ olarak) alฤฑnฤฑr ve commit edilene veya rollback olana kadar transaction tarafฤฑndan tutulur. Bu modda, kilitler รถnce birincil nodeโlarda alฤฑnฤฑr ve ardฤฑndan hazฤฑrlฤฑk aลamasฤฑ sฤฑrasฤฑnda yedek nodeโlara yรผkseltilir. Aลaฤฤฑdaki izolasyon seviyeleri, PESSIMISTIC eลzamanlฤฑlฤฑk modu ile yapฤฑlandฤฑrฤฑlabilir:
READ_COMMITTED โVeriler kilitlenmeden okunur ve hiรงbir zaman transactionโฤฑn kendisinde cacheโe alฤฑnmaz. Cache yapฤฑlandฤฑrmasฤฑnda buna izin veriliyorsa, veriler bir yedekleme nodeโundan okunabilir. Bu izolasyon modunda, Tekrarlanamayan Okumalara sahip olabilirsiniz รงรผnkรผ eลzamanlฤฑ bir transaction, transactionunuzda verileri iki kez okurken verileri deฤiลtirebilir. Kilit, yalnฤฑzca ilk yazma eriลimi sฤฑrasฤฑnda alฤฑnฤฑr (bu,EntryProcessorรงaฤrฤฑsฤฑnฤฑ iรงerir). Bu, transaction sฤฑrasฤฑnda okunan bir giriลin, transactionโฤฑn gerรงekleลtirildiฤi zamana kadar farklฤฑ bir deฤere sahip olabileceฤi anlamฤฑna gelir. Bu durumda herhangi bir hata oluลmaz.REPEATABLE_READ โGiriล kilidi alฤฑnฤฑr ve veriler ilk okuma veya yazma eriลimindeki birincil nodeโdan alฤฑnฤฑr ve yerel transaction haritasฤฑnda(local transaction map) depolanฤฑr. Aynฤฑ verilere ardฤฑลฤฑk tรผm eriลimler yereldir ve son okunan veya gรผncellenen transaction deฤerini dรถndรผrรผr. Bu, baลka hiรงbir eลzamanlฤฑ transactionโฤฑn kilitli verilerde deฤiลiklik yapamayacaฤฤฑ ve transactionฤฑnฤฑz iรงin Tekrarlanabilir Okumalar alacaฤฤฑnฤฑz anlamฤฑna gelir.SERIALIZABLE โPESSIMISTICmodunda, bu izolasyon seviyesiREPEATABLE_READile aynฤฑ ลekilde รงalฤฑลฤฑr.
PESSIMISTIC modunda kilitleme sฤฑrasฤฑnฤฑn รถnemli olduฤunu unutmayฤฑn. Ayrฤฑca kilitler sฤฑrayla ve tam olarak belirtilen sฤฑrada alฤฑnฤฑr.
En az bir
PESSIMISTICtransaction kilidi elde edilirse, transaction commitlenene veya rollback olana kadar cache topolojisini deฤiลtirmenin imkansฤฑz olduฤunu unutmayฤฑn. Bu nedenle, transaction kilitlerini uzun sรผre tutmaktan kaรงฤฑnmalฤฑsฤฑnฤฑz.
Optimistic Transactions
OPTIMISTIC transactionlarda, 2PC'nin ilk aลamasฤฑnda, hazฤฑrlฤฑk adฤฑmฤฑnda birincil nodeโlarda giriล kilitleri alฤฑnฤฑr ve ardฤฑndan yedek nodelara yรผkseltilir ve transaction tamamlandฤฑktan sonra serbest bฤฑrakฤฑlฤฑr. Transactionโฤฑ geri alฤฑrsanฤฑz ve hiรงbir commit giriลiminde bulunulmazsa kilitler asla alฤฑnmaz. OPTIMISTIC eลzamanlฤฑlฤฑk modu ile aลaฤฤฑdaki izolasyon seviyeleri yapฤฑlandฤฑrฤฑlabilir:
READ_COMMITTED โ Cacheโe uygulanmasฤฑ gereken deฤiลiklikler kaynak nodeโda toplanฤฑr ve transaction commitinde uygulanฤฑr. Transaction verileri kilitlenmeden okunur ve transactionda asla cacheโe alฤฑnmaz. Cache yapฤฑlandฤฑrmasฤฑnda buna izin veriliyorsa, veriler bir yedekleme nodeโundan okunabilir. Bu izolasyonda, Tekrarlanamayan Okumalara sahip olabilirsiniz รงรผnkรผ eลzamanlฤฑ bir transaction, transactionฤฑnฤฑnฤฑzda verileri iki kez okurken verileri deฤiลtirebilir. Bu mod kombinasyonu, giriล deฤerinin ilk okuma veya yazma eriลiminden bu yana deฤiลtirilip deฤiลtirilmediฤini kontrol etmez ve asla optimistic bir hata oluลturmaz.
REPEATABLE_READ โ Bu yalฤฑtฤฑm dรผzeyindeki transactionlar, tek bir farkla OPTIMISTIC READ_COMMITTED iลlemlerine benzer ลekilde รงalฤฑลฤฑr: okuma deฤerleri kaynak nodeโda cacheโe alฤฑnฤฑr ve sonraki tรผm okumalarฤฑn yerel olmasฤฑ garanti edilir. Bu mod kombinasyonu, giriล deฤerinin ilk okuma veya yazma eriลiminden bu yana deฤiลtirilip deฤiลtirilmediฤini kontrol etmez ve asla optimistic bir hata oluลturmaz.
SERIALIZABLE โ ฤฐlk okuma eriลimi รผzerine bir giriล sรผrรผmรผnรผ saklar. Ignite motoru, baลlatฤฑlan transactionโฤฑn bir parรงasฤฑ olarak kullanฤฑlan girdilerden en az birinin deฤiลtirildiฤini algฤฑlarsa, Ignite iลlemi tamamlama aลamasฤฑnda baลarฤฑsฤฑz olur. Kฤฑsacasฤฑ, bu, Ignite'ฤฑn bir transactionโฤฑn commit aลamasฤฑnda bir รงakฤฑลma olduฤunu tespit etmesi durumunda, transactionโฤฑ baลarฤฑsฤฑz kฤฑlarak TransactionOptimisticException'ฤฑ atmasฤฑ ve yapฤฑlan deฤiลiklikleri geri almasฤฑ anlamฤฑna gelir. Bu hatayฤฑ handle ettiฤinizden emin olun ve transactionโฤฑ yeniden deneyin.
Burada dikkat edilmesi gereken bir diฤer รถnemli nokta, bir giriล deฤiลtirilmeden okunsa bile (cache.put(โฆ)) bir iลlemin baลarฤฑsฤฑz olmasฤฑdฤฑr, รงรผnkรผ giriลin deฤeri baลlatฤฑlan transaction iรงindeki mantฤฑk iรงin รถnemli olabilir.
READ_COMMITTED ve REPEATABLE_READ transactionlarฤฑ iรงin key sฤฑrasฤฑnฤฑn รถnemli olduฤunu unutmayฤฑn, รงรผnkรผ bu modlarda kilitler yine sฤฑralฤฑ olarak alฤฑnฤฑr.
Read Consistency
PESSIMISTIC modunda tam okuma tutarlฤฑlฤฑฤฤฑ elde etmek iรงin okuma kilitlerinin edinilmesi gerekir. Bu, PESSIMISTIC modundaki okumalar arasฤฑndaki tam tutarlฤฑlฤฑฤฤฑn yalnฤฑzca PESSIMISTIC REPEATABLE_READ (veya SERIALIZABLE) transactionlarฤฑyla saฤlanabileceฤi anlamฤฑna gelir.
OPTIMISTIC transactionlarฤฑ kullanฤฑlฤฑrken, okumalar arasฤฑndaki olasฤฑ รงakฤฑลmalara izin verilmeyerek tam okuma tutarlฤฑlฤฑฤฤฑ saฤlanabilir. Bu davranฤฑล OPTIMISTIC SERIALIZABLE modu tarafฤฑndan saฤlanฤฑr. Ancak, commit gerรงekleลene kadar parรงalฤฑ bir transaction durumunu hala okuyabileceฤinizi, bu nedenle transaction mantฤฑฤฤฑnฤฑn buna karลฤฑ koruma saฤlamasฤฑ gerektiฤini unutmayฤฑn. Yalnฤฑzca commit aลamasฤฑnda, herhangi bir รงakฤฑลma durumunda, transactionโฤฑ yeniden denemenizi saฤlayan bir TransactionOptimisticException atฤฑlฤฑr.
PESSIMISTIC REPEATABLE_READ veya SERIALIZABLE transactionlarฤฑ veya OPTIMISTIC SERIALIZABLE transactionlarฤฑ kullanmฤฑyorsanฤฑz parรงalฤฑ transaction durumu gรถrmeniz mรผmkรผndรผr. Bu, bir transaction A ve B nesnelerini gรผncellerse, baลka bir transactionโun A iรงin yeni deฤeri ve B iรงin eski deฤeri gรถrebileceฤi anlamฤฑna gelir.
Deadlock Detection
Daฤฤฑtฤฑk transactionlarda รงalฤฑลฤฑrken bilmeniz gereken รถnemli bir kural, bir transactiona katฤฑlan keylerin kilitlerinin aynฤฑ sฤฑrada alฤฑnmasฤฑ gerektiฤidir. Bu kuralฤฑ ihlal etmek, daฤฤฑtฤฑk bir deadlockโa yol aรงabilir.
Ignite, daฤฤฑtฤฑk deadlocklardan kaรงฤฑnmaz, bunun yerine bu tรผr durumlarda hata ayฤฑklamayฤฑ ve dรผzeltmeyi kolaylaลtฤฑran built-in iลlevselliฤe sahiptir.
Aลaฤฤฑdaki kod parรงacฤฑฤฤฑnda, zaman aลฤฑmฤฑ ile bir transaction baลlatฤฑldฤฑ. Zaman aลฤฑmฤฑ sona ererse, deadlock algฤฑlama prosedรผrรผ, zaman aลฤฑmฤฑna neden olabilecek olasฤฑ bir deadlock bulmaya รงalฤฑลฤฑr. Zaman aลฤฑmฤฑ sรผresi dolduฤunda, deadlocktan baฤฤฑmsฤฑz olarak CacheException'ฤฑn nedeni olarak TransactionTimeoutException oluลturulur ve fฤฑrlatฤฑlฤฑr. Bununla birlikte, bir deadlock algฤฑlanฤฑrsa, dรถndรผrรผlen TransactionTimeoutException'ฤฑn nedeni TransactionDeadlockException olacaktฤฑr (deadlockโa dahil olan en az bir transaction iรงin).
TransactionDeadlockException mesajฤฑ, deadlockโun nedenini bulmanฤฑza yardฤฑmcฤฑ olabilecek yararlฤฑ bilgiler iรงerir.
Deadlock tespiti, clusterdaki nodelarฤฑn sayฤฑsฤฑna, keylere ve olasฤฑ bir deadlockโa dahil olan transactionlara baฤlฤฑ olarak birรงok yineleme alabilen รงok adฤฑmlฤฑ bir prosedรผrdรผr. Deadlock algฤฑlama baลlatฤฑcฤฑsฤฑ, bir transactionโun baลlatฤฑldฤฑฤฤฑ ve bir TransactionTimeoutException ile baลarฤฑsฤฑz olduฤu bir nodedur. Bu node, diฤer remote nodelarla reques/response alฤฑลveriลi yaparak bir deadlock olup olmadฤฑฤฤฑnฤฑ araลtฤฑrฤฑr ve ardฤฑndan TransactionDeadlockException ile saฤlanan deadlock ile ilgili bir rapor hazฤฑrlar. Bu tรผr her mesaj (request/response) yineleme olarak bilinir.
Bir transaction, deadlock algฤฑlama prosedรผrรผ tamamlanana kadar geri alฤฑnmadฤฑฤฤฑndan(rollback), bir transactionโun geri alฤฑnmasฤฑ iรงin รถngรถrรผlebilir bir sรผre istiyorsanฤฑz, bazen parametreleri ayarlamak mantฤฑklฤฑdฤฑr (aลaฤฤฑda gรถsterilmektedir).
IgniteSystemProperties.IGNITE_TX_DEADLOCK_DETECTION_MAX_ITERS โDeadlock algฤฑlama prosedรผrรผ iรงin maksimum yineleme sayฤฑsฤฑnฤฑ belirtir. Bu รถzelliฤin deฤeri sฤฑfฤฑrdan kรผรงรผk veya sฤฑfฤฑra eลitse, deadlock tespiti devre dฤฑลฤฑ bฤฑrakฤฑlฤฑr (varsayฤฑlan olarak 1000);IgniteSystemProperties.IGNITE_TX_DEADLOCK_DETECTION_TIMEOUT โDeadlock algฤฑlama mekanizmasฤฑ iรงin zaman aลฤฑmฤฑnฤฑ belirtir (varsayฤฑlan olarak 1 dakika).
รok az yineleme varsa, tamamlanmamฤฑล bir deadlock raporu alabileceฤinizi unutmayฤฑn.
Deadlock-free Transactions
OPTIMISTIC SERIALIZABLE transactionlar iรงin kilitler sฤฑralฤฑ olarak alฤฑnmaz. Bu modda, keylere herhangi bir sฤฑrada eriลilebilir รงรผnkรผ transaction kilitleri, Ignite'ฤฑn deadlocklarฤฑndan kaรงฤฑnmasฤฑna izin veren ek bir kontrolle paralel olarak alฤฑnฤฑr.
SERIALIZABLE transactionlarda kilitlerin nasฤฑl รงalฤฑลtฤฑฤฤฑnฤฑ aรงฤฑklamak iรงin bazฤฑ kavramlarฤฑ bilmek gerekiyor. Ignite'ta her iลleme, XidVersion adlฤฑ karลฤฑlaลtฤฑrฤฑlabilir bir sรผrรผm atanฤฑr. Transaction commitโi รผzerine, transactionda yazฤฑlan her girdiye EntryVersion adฤฑ verilen yeni bir karลฤฑlaลtฤฑrฤฑlabilir sรผrรผm atanฤฑr. XidVersionA sรผrรผmรผne sahip bir OPTIMISTIC SERIALIZABLE transactionโu, aลaฤฤฑdaki durumlarda TransactionOptimisticException ile baลarฤฑsฤฑz olur:
SERIALIZABLEtransactionunun bir giriลinde kilit tutan, devam eden birPESSIMISTICveya non-serializableOPTIMISTICtransaction var.XidVersionB > XidVersionAลeklindeXidVersionBsรผrรผmรผyle devam eden baลka birOPTIMISTIC SERIALIZABLEtransaction var ve bu transactionSERIALIZABLEtransactionunun bir giriลinde kilit tutuyor.OPTIMISTIC SERIALIZABLEtransactionโu gerekli tรผm kilitleri edindiฤinde, geรงerli sรผrรผm, committen รถnce gรถzlemlenen sรผrรผmden farklฤฑ olan bir giriล vardฤฑr.
Yรผksek derecede eลzamanlฤฑ bir ortamda, optimistic kilitleme, yรผksek transaction baลarฤฑsฤฑzlฤฑk oranฤฑna yol aรงabilir, ancak pessimistic kilitleme, kilitler transactionlar tarafฤฑndan farklฤฑ bir sฤฑrayla elde edilirse deadlocklara yol aรงabilir.
Bununla birlikte, contention-free bir ortamda, optimistic serializable kilitleme, bรผyรผk transactionlar iรงin daha iyi performans saฤlayabilir รงรผnkรผ network trip sayฤฑsฤฑ yalnฤฑzca transactionโun yayฤฑldฤฑฤฤฑ node sayฤฑsฤฑna baฤlฤฑdฤฑr ve transactiondaki key sayฤฑsฤฑna baฤlฤฑ deฤildir.
Last updated