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 Modesarrow-up-right 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;

chevron-rightโŒจ๏ธ XML Confighashtag
<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>
chevron-rightโŒจ๏ธ .NET Confighashtag
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.

chevron-rightโŒจ๏ธ .NET Samplehashtag
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 โ†’ PESSIMISTIC modunda, bu izolasyon seviyesi REPEATABLE_READ ile 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 PESSIMISTIC transaction 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.

chevron-rightโŒจ๏ธ .NET Samplehashtag

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).

chevron-rightโŒจ๏ธ .NET Samplehashtag

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:

  • SERIALIZABLE transactionunun bir giriลŸinde kilit tutan, devam eden bir PESSIMISTIC veya non-serializable OPTIMISTIC transaction var.

  • XidVersionB > XidVersionA ลŸeklinde XidVersionB sรผrรผmรผyle devam eden baลŸka bir OPTIMISTIC SERIALIZABLE transaction var ve bu transaction SERIALIZABLE transactionunun bir giriลŸinde kilit tutuyor.

  • OPTIMISTIC SERIALIZABLE transactionโ€™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.

Daha fazla bilgi iรงinโ€ฆarrow-up-right

Last updated