[{"data":1,"prerenderedAt":1667},["ShallowReactive",2],{"navigation_docs_hu":3,"-hu-dbx-transactions":442,"-hu-dbx-transactions-surround":1662},[4,45,60,81,112,129,146,173,197,213,242,280,357,373,385,404,430],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":44},"Kezdő lépések","i-lucide-rocket","\u002Fhu\u002Fgetting-started","hu\u002F1.getting-started",[10,15,20,24,29,34,39],{"title":11,"path":12,"stem":13,"icon":14},"Bevezetés","\u002Fhu\u002Fgetting-started\u002Fintroduction","hu\u002F1.getting-started\u002F1.introduction","i-lucide-house",{"title":16,"path":17,"stem":18,"icon":19},"Laravelből érkezőknek","\u002Fhu\u002Fgetting-started\u002Fcoming-from-laravel","hu\u002F1.getting-started\u002F2.coming-from-laravel","i-lucide-arrow-right-left",{"title":21,"path":22,"stem":23,"icon":19},"Symfonyból érkezőknek","\u002Fhu\u002Fgetting-started\u002Fcoming-from-symfony","hu\u002F1.getting-started\u002F3.coming-from-symfony",{"title":25,"path":26,"stem":27,"icon":28},"Telepítés","\u002Fhu\u002Fgetting-started\u002Finstallation","hu\u002F1.getting-started\u002F4.installation","i-lucide-download",{"title":30,"path":31,"stem":32,"icon":33},"Az első modulod","\u002Fhu\u002Fgetting-started\u002Ffirst-module","hu\u002F1.getting-started\u002F5.first-module","i-lucide-package-plus",{"title":35,"path":36,"stem":37,"icon":38},"Projektstruktúra","\u002Fhu\u002Fgetting-started\u002Fproject-structure","hu\u002F1.getting-started\u002F6.project-structure","i-lucide-folder-tree",{"title":40,"path":41,"stem":42,"icon":43},"A shop mintaalkalmazás","\u002Fhu\u002Fgetting-started\u002Fsample-app","hu\u002F1.getting-started\u002F7.sample-app","i-lucide-shopping-cart",false,{"title":46,"icon":47,"path":48,"stem":49,"children":50,"page":44},"queue","i-lucide-layers","\u002Fhu\u002Fqueue","hu\u002F10.queue",[51,56],{"title":52,"path":53,"stem":54,"icon":55},"Áttekintés","\u002Fhu\u002Fqueue\u002Foverview","hu\u002F10.queue\u002F1.overview","i-lucide-list-ordered",{"title":57,"path":58,"stem":59,"icon":47},"Taskok","\u002Fhu\u002Fqueue\u002Ftasks","hu\u002F10.queue\u002F2.tasks",{"title":61,"icon":62,"path":63,"stem":64,"children":65,"page":44},"events","i-lucide-workflow","\u002Fhu\u002Fevents","hu\u002F11.events",[66,71,76],{"title":67,"path":68,"stem":69,"icon":70},"Események","\u002Fhu\u002Fevents\u002Foverview","hu\u002F11.events\u002F1.overview","i-lucide-radio",{"title":72,"path":73,"stem":74,"icon":75},"Outbox","\u002Fhu\u002Fevents\u002Foutbox","hu\u002F11.events\u002F2.outbox","i-lucide-inbox",{"title":77,"path":78,"stem":79,"icon":80},"Ütemezés","\u002Fhu\u002Fevents\u002Fscheduler","hu\u002F11.events\u002F3.scheduler","i-lucide-calendar-clock",{"title":82,"icon":83,"path":84,"stem":85,"children":86,"page":44},"auth","i-lucide-shield-check","\u002Fhu\u002Fauth","hu\u002F12.auth",[87,92,97,102,107],{"title":88,"path":89,"stem":90,"icon":91},"Autentikáció","\u002Fhu\u002Fauth\u002Foverview","hu\u002F12.auth\u002F1.overview","i-lucide-key-round",{"title":93,"path":94,"stem":95,"icon":96},"RBAC","\u002Fhu\u002Fauth\u002Frbac","hu\u002F12.auth\u002F2.rbac","i-lucide-users",{"title":98,"path":99,"stem":100,"icon":101},"Policy-k","\u002Fhu\u002Fauth\u002Fpolicy","hu\u002F12.auth\u002F3.policy","i-lucide-gavel",{"title":103,"path":104,"stem":105,"icon":106},"Az auth önálló használata","\u002Fhu\u002Fauth\u002Fstandalone","hu\u002F12.auth\u002F4.standalone","i-lucide-plug",{"title":108,"path":109,"stem":110,"icon":111},"Social login goth-tal, önállóan","\u002Fhu\u002Fauth\u002Fsocial-standalone","hu\u002F12.auth\u002F5.social-standalone","i-lucide-log-in",{"title":113,"icon":114,"path":115,"stem":116,"children":117,"page":44},"mail","i-lucide-mail","\u002Fhu\u002Fmail","hu\u002F13.mail",[118,121,125],{"title":52,"path":119,"stem":120,"icon":114},"\u002Fhu\u002Fmail\u002Foverview","hu\u002F13.mail\u002F1.overview",{"title":122,"path":123,"stem":124,"icon":114},"SMTP","\u002Fhu\u002Fmail\u002Fsmtp","hu\u002F13.mail\u002F2.smtp",{"title":126,"path":127,"stem":128,"icon":114},"MJML","\u002Fhu\u002Fmail\u002Fmjml","hu\u002F13.mail\u002F3.mjml",{"title":130,"icon":131,"path":132,"stem":133,"children":134,"page":44},"notify","i-lucide-bell","\u002Fhu\u002Fnotify","hu\u002F14.notify",[135,138,142],{"title":52,"path":136,"stem":137,"icon":131},"\u002Fhu\u002Fnotify\u002Foverview","hu\u002F14.notify\u002F1.overview",{"title":139,"path":140,"stem":141,"icon":131},"Database csatorna","\u002Fhu\u002Fnotify\u002Fdatabase","hu\u002F14.notify\u002F2.database",{"title":143,"path":144,"stem":145,"icon":131},"Broadcast csatorna","\u002Fhu\u002Fnotify\u002Fbroadcast","hu\u002F14.notify\u002F3.broadcast",{"title":147,"icon":148,"path":149,"stem":150,"children":151,"page":44},"storage","i-lucide-hard-drive","\u002Fhu\u002Fstorage","hu\u002F15.storage",[152,155,159,163,168],{"title":52,"path":153,"stem":154,"icon":148},"\u002Fhu\u002Fstorage\u002Foverview","hu\u002F15.storage\u002F1.overview",{"title":156,"path":157,"stem":158},"Disk API","\u002Fhu\u002Fstorage\u002Fdisk-api","hu\u002F15.storage\u002F2.disk-api",{"title":160,"path":161,"stem":162,"icon":148},"Memória és helyi lemez","\u002Fhu\u002Fstorage\u002Flocal","hu\u002F15.storage\u002F3.local",{"title":164,"path":165,"stem":166,"icon":167},"S3","\u002Fhu\u002Fstorage\u002Fs3","hu\u002F15.storage\u002F4.s3","i-lucide-cloud",{"title":169,"path":170,"stem":171,"icon":172},"Tesztelés","\u002Fhu\u002Fstorage\u002Ftesting","hu\u002F15.storage\u002F5.testing","i-lucide-flask-conical",{"title":174,"icon":175,"path":176,"stem":177,"children":178,"page":44},"telemetry","i-lucide-activity","\u002Fhu\u002Ftelemetry","hu\u002F16.telemetry",[179,182,187,192],{"title":52,"path":180,"stem":181,"icon":175},"\u002Fhu\u002Ftelemetry\u002Foverview","hu\u002F16.telemetry\u002F1.overview",{"title":183,"path":184,"stem":185,"icon":186},"Logolás","\u002Fhu\u002Ftelemetry\u002Flogging","hu\u002F16.telemetry\u002F2.logging","i-lucide-scroll-text",{"title":188,"path":189,"stem":190,"icon":191},"OpenTelemetry","\u002Fhu\u002Ftelemetry\u002Fopentelemetry","hu\u002F16.telemetry\u002F3.opentelemetry","i-lucide-radar",{"title":193,"path":194,"stem":195,"icon":196},"Sentry","\u002Fhu\u002Ftelemetry\u002Fsentry","hu\u002F16.telemetry\u002F4.sentry","i-lucide-bug",{"title":198,"icon":199,"path":200,"stem":201,"children":202,"page":44},"Referencia","i-lucide-book-open","\u002Fhu\u002Freference","hu\u002F17.reference",[203,208],{"title":204,"path":205,"stem":206,"icon":207},"Konfiguráció","\u002Fhu\u002Freference\u002Fconfiguration","hu\u002F17.reference\u002F1.configuration","i-lucide-settings",{"title":209,"path":210,"stem":211,"icon":212},"Külső függőségek","\u002Fhu\u002Freference\u002Fdependencies","hu\u002F17.reference\u002F2.dependencies","i-lucide-package",{"title":214,"icon":215,"path":216,"stem":217,"children":218,"page":44},"Koncepciók","i-lucide-lightbulb","\u002Fhu\u002Fconcepts","hu\u002F2.concepts",[219,223,228,232,237],{"title":220,"path":221,"stem":222,"icon":47},"Architektúra","\u002Fhu\u002Fconcepts\u002Farchitecture","hu\u002F2.concepts\u002F1.architecture",{"title":224,"path":225,"stem":226,"icon":227},"Hibamodell","\u002Fhu\u002Fconcepts\u002Ferror-model","hu\u002F2.concepts\u002F2.error-model","i-lucide-shield-alert",{"title":204,"path":229,"stem":230,"icon":231},"\u002Fhu\u002Fconcepts\u002Fconfiguration","hu\u002F2.concepts\u002F3.configuration","i-lucide-settings-2",{"title":233,"path":234,"stem":235,"icon":236},"Codegen pipeline","\u002Fhu\u002Fconcepts\u002Fcodegen-pipeline","hu\u002F2.concepts\u002F4.codegen-pipeline","i-lucide-file-json",{"title":238,"path":239,"stem":240,"icon":241},"Design patternek","\u002Fhu\u002Fconcepts\u002Fdesign-patterns","hu\u002F2.concepts\u002F5.design-patterns","i-lucide-puzzle",{"title":243,"icon":244,"path":245,"stem":246,"children":247,"page":44},"A kit","i-lucide-box","\u002Fhu\u002Fkit","hu\u002F3.kit",[248,252,257,262,267,271,276],{"title":249,"path":250,"stem":251,"icon":244},"A kit áttekintése","\u002Fhu\u002Fkit\u002Foverview","hu\u002F3.kit\u002F1.overview",{"title":253,"path":254,"stem":255,"icon":256},"Alkalmazás-életciklus","\u002Fhu\u002Fkit\u002Fapp","hu\u002F3.kit\u002F2.app","i-lucide-power",{"title":258,"path":259,"stem":260,"icon":261},"Szerver","\u002Fhu\u002Fkit\u002Fserver","hu\u002F3.kit\u002F3.server","i-lucide-server",{"title":263,"path":264,"stem":265,"icon":266},"Worker","\u002Fhu\u002Fkit\u002Fworker","hu\u002F3.kit\u002F4.worker","i-lucide-cog",{"title":268,"path":269,"stem":270,"icon":70},"Realtime","\u002Fhu\u002Fkit\u002Frealtime","hu\u002F3.kit\u002F5.realtime",{"title":272,"path":273,"stem":274,"icon":275},"Migrációk","\u002Fhu\u002Fkit\u002Fmigrations","hu\u002F3.kit\u002F6.migrations","i-lucide-file-stack",{"title":277,"path":278,"stem":279,"icon":111},"Social login","\u002Fhu\u002Fkit\u002Fsocial-login","hu\u002F3.kit\u002F7.social-login",{"title":281,"icon":282,"path":283,"stem":284,"children":285,"page":44},"CLI referencia","i-lucide-terminal","\u002Fhu\u002Fcli","hu\u002F4.cli",[286,289,294,299,304,309,314,319,324,329,334,338,343,348,352],{"title":52,"path":287,"stem":288,"icon":282},"\u002Fhu\u002Fcli\u002Foverview","hu\u002F4.cli\u002F1.overview",{"title":290,"path":291,"stem":292,"icon":293},"add db","\u002Fhu\u002Fcli\u002Fadd-db","hu\u002F4.cli\u002F10.add-db","i-lucide-database-zap",{"title":295,"path":296,"stem":297,"icon":298},"add compose \u002F add docker","\u002Fhu\u002Fcli\u002Fadd-compose","hu\u002F4.cli\u002F11.add-compose","i-lucide-container",{"title":300,"path":301,"stem":302,"icon":303},"add mail","\u002Fhu\u002Fcli\u002Fadd-mail","hu\u002F4.cli\u002F12.add-mail","i-lucide-mail-plus",{"title":305,"path":306,"stem":307,"icon":308},"add notification","\u002Fhu\u002Fcli\u002Fadd-notification","hu\u002F4.cli\u002F13.add-notification","i-lucide-bell-plus",{"title":310,"path":311,"stem":312,"icon":313},"add realtime","\u002Fhu\u002Fcli\u002Fadd-realtime","hu\u002F4.cli\u002F14.add-realtime","i-lucide-radio-tower",{"title":315,"path":316,"stem":317,"icon":318},"add seeder","\u002Fhu\u002Fcli\u002Fadd-seeder","hu\u002F4.cli\u002F15.add-seeder","i-lucide-sprout",{"title":320,"path":321,"stem":322,"icon":323},"new project","\u002Fhu\u002Fcli\u002Fnew-project","hu\u002F4.cli\u002F2.new-project","i-lucide-folder-plus",{"title":325,"path":326,"stem":327,"icon":328},"new module","\u002Fhu\u002Fcli\u002Fnew-module","hu\u002F4.cli\u002F3.new-module","i-lucide-blocks",{"title":330,"path":331,"stem":332,"icon":333},"add surface","\u002Fhu\u002Fcli\u002Fadd-surface","hu\u002F4.cli\u002F4.add-surface","i-lucide-layers-2",{"title":335,"path":336,"stem":337,"icon":244},"add core","\u002Fhu\u002Fcli\u002Fadd-core","hu\u002F4.cli\u002F5.add-core",{"title":339,"path":340,"stem":341,"icon":342},"add handler","\u002Fhu\u002Fcli\u002Fadd-handler","hu\u002F4.cli\u002F6.add-handler","i-lucide-webhook",{"title":344,"path":345,"stem":346,"icon":347},"new migration","\u002Fhu\u002Fcli\u002Fnew-migration","hu\u002F4.cli\u002F7.new-migration","i-lucide-file-plus",{"title":349,"path":350,"stem":351,"icon":266},"worker generátorok","\u002Fhu\u002Fcli\u002Fworker-generators","hu\u002F4.cli\u002F8.worker-generators",{"title":353,"path":354,"stem":355,"icon":356},"upgrade templates","\u002Fhu\u002Fcli\u002Fupgrade-templates","hu\u002F4.cli\u002F9.upgrade-templates","i-lucide-refresh-cw",{"title":358,"icon":227,"path":359,"stem":360,"children":361,"page":44},"errs","\u002Fhu\u002Ferrs","hu\u002F5.errs",[362,365,369],{"title":52,"path":363,"stem":364,"icon":227},"\u002Fhu\u002Ferrs\u002Foverview","hu\u002F5.errs\u002F1.overview",{"title":366,"path":367,"stem":368},"API","\u002Fhu\u002Ferrs\u002Fapi","hu\u002F5.errs\u002F2.api",{"title":370,"path":371,"stem":372,"icon":227},"Integráció","\u002Fhu\u002Ferrs\u002Fintegration","hu\u002F5.errs\u002F3.integration",{"title":374,"icon":231,"path":375,"stem":376,"children":377,"page":44},"envconf","\u002Fhu\u002Fenvconf","hu\u002F6.envconf",[378,381],{"title":52,"path":379,"stem":380,"icon":231},"\u002Fhu\u002Fenvconf\u002Foverview","hu\u002F6.envconf\u002F1.overview",{"title":382,"path":383,"stem":384},"Receptek","\u002Fhu\u002Fenvconf\u002Frecipes","hu\u002F6.envconf\u002F2.recipes",{"title":386,"icon":387,"path":388,"stem":389,"children":390,"page":44},"httperr","i-lucide-globe","\u002Fhu\u002Fhttperr","hu\u002F7.httperr",[391,394,399],{"title":52,"path":392,"stem":393,"icon":387},"\u002Fhu\u002Fhttperr\u002Foverview","hu\u002F7.httperr\u002F1.overview",{"title":395,"path":396,"stem":397,"icon":398},"Hibaválaszok","\u002Fhu\u002Fhttperr\u002Ferror-responses","hu\u002F7.httperr\u002F2.error-responses","i-lucide-octagon-alert",{"title":400,"path":401,"stem":402,"icon":403},"Validáció","\u002Fhu\u002Fhttperr\u002Fvalidation","hu\u002F7.httperr\u002F3.validation","i-lucide-badge-check",{"title":405,"icon":406,"path":407,"stem":408,"children":409,"page":44},"dbx","i-lucide-database","\u002Fhu\u002Fdbx","hu\u002F8.dbx",[410,413,417,421,426],{"title":52,"path":411,"stem":412,"icon":406},"\u002Fhu\u002Fdbx\u002Foverview","hu\u002F8.dbx\u002F1.overview",{"title":414,"path":415,"stem":416,"icon":106},"pgx","\u002Fhu\u002Fdbx\u002Fpg","hu\u002F8.dbx\u002F2.pg",{"title":418,"path":419,"stem":420,"icon":47},"bun","\u002Fhu\u002Fdbx\u002Fbunx","hu\u002F8.dbx\u002F3.bunx",{"title":422,"path":423,"stem":424,"icon":425},"Tranzakciók","\u002Fhu\u002Fdbx\u002Ftransactions","hu\u002F8.dbx\u002F4.transactions","i-lucide-git-merge",{"title":427,"path":428,"stem":429,"icon":318},"Seederek","\u002Fhu\u002Fdbx\u002Fseed","hu\u002F8.dbx\u002F5.seed",{"title":431,"icon":55,"path":432,"stem":433,"children":434,"page":44},"paginate","\u002Fhu\u002Fpaginate","hu\u002F9.paginate",[435,438],{"title":52,"path":436,"stem":437,"icon":55},"\u002Fhu\u002Fpaginate\u002Foverview","hu\u002F9.paginate\u002F1.overview",{"title":439,"path":440,"stem":441,"icon":19},"Cursor-lapozás","\u002Fhu\u002Fpaginate\u002Fcursor","hu\u002F9.paginate\u002F2.cursor",{"id":443,"title":422,"body":444,"description":1655,"extension":1656,"links":1657,"meta":1658,"navigation":1659,"path":423,"seo":1660,"stem":424,"__hash__":1661},"docs_hu\u002Fhu\u002F8.dbx\u002F4.transactions.md",{"type":445,"value":446,"toc":1646},"minimark",[447,467,472,800,829,833,848,863,1332,1351,1395,1413,1417,1428,1467,1473,1484,1488,1501,1537,1544,1548,1571,1575,1624,1628,1642],[448,449,450,451,454,455,459,460,463,464,466],"p",{},"A ",[452,453,405],"code",{}," mögötti kemény követelmény: ",[456,457,458],"strong",{},"egy service-nek képesnek kell lennie több repositoryt hívni egyetlen adatbázis-tranzakcióban, anélkül hogy bármelyik repository tudna a tranzakciókról."," Ez az oldal a mintát tárgyalja mélységében: a mechanika pgx-specifikus részletei a ",[461,462,414],"a",{"href":415}," oldalon, a bun-változat a ",[461,465,418],{"href":419}," oldalon.",[468,469,471],"h2",{"id":470},"a-három-építőelem","A három építőelem",[473,474,479],"pre",{"className":475,"code":476,"language":477,"meta":478,"style":478},"language-go shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u002F\u002F 1. A kontrakt, amit a service fog (dbx csomag, driver-független):\ntype Transactor interface {\n    WithinTransaction(ctx context.Context, fn func(ctx context.Context) error) error\n}\n\n\u002F\u002F 2. A query-felület, amit a repositoryk fognak (itt a pgx-változat):\ntype DBTX interface {\n    Exec(ctx context.Context, sql string, args ...any) (pgconn.CommandTag, error)\n    Query(ctx context.Context, sql string, args ...any) (pgx.Rows, error)\n    QueryRow(ctx context.Context, sql string, args ...any) pgx.Row\n}\n\n\u002F\u002F 3. Az executor, ami a kettőt összeköti: minden hívás előbb tranzakciót\n\u002F\u002F    keres a contextben; ha nincs, a poolon fut.\ndb := pg.NewDB(pool)\ntx := pg.NewTransactor(pool)\n","go","",[452,480,481,490,507,559,565,572,578,590,645,692,732,737,742,748,754,779],{"__ignoreMap":478},[482,483,486],"span",{"class":484,"line":485},"line",1,[482,487,489],{"class":488},"sHwdD","\u002F\u002F 1. A kontrakt, amit a service fog (dbx csomag, driver-független):\n",[482,491,493,497,501,504],{"class":484,"line":492},2,[482,494,496],{"class":495},"sMK4o","type",[482,498,500],{"class":499},"sBMFI"," Transactor",[482,502,503],{"class":495}," interface",[482,505,506],{"class":495}," {\n",[482,508,510,514,517,521,524,527,530,533,536,539,541,543,545,547,550,554,556],{"class":484,"line":509},3,[482,511,513],{"class":512},"s2Zo4","    WithinTransaction",[482,515,516],{"class":495},"(",[482,518,520],{"class":519},"sHdIc","ctx",[482,522,523],{"class":499}," context",[482,525,526],{"class":495},".",[482,528,529],{"class":499},"Context",[482,531,532],{"class":495},",",[482,534,535],{"class":519}," fn",[482,537,538],{"class":495}," func(",[482,540,520],{"class":519},[482,542,523],{"class":499},[482,544,526],{"class":495},[482,546,529],{"class":499},[482,548,549],{"class":495},")",[482,551,553],{"class":552},"spNyl"," error",[482,555,549],{"class":495},[482,557,558],{"class":552}," error\n",[482,560,562],{"class":484,"line":561},4,[482,563,564],{"class":495},"}\n",[482,566,568],{"class":484,"line":567},5,[482,569,571],{"emptyLinePlaceholder":570},true,"\n",[482,573,575],{"class":484,"line":574},6,[482,576,577],{"class":488},"\u002F\u002F 2. A query-felület, amit a repositoryk fognak (itt a pgx-változat):\n",[482,579,581,583,586,588],{"class":484,"line":580},7,[482,582,496],{"class":495},[482,584,585],{"class":499}," DBTX",[482,587,503],{"class":495},[482,589,506],{"class":495},[482,591,593,596,598,600,602,604,606,608,611,614,616,619,622,625,627,630,633,635,638,640,642],{"class":484,"line":592},8,[482,594,595],{"class":512},"    Exec",[482,597,516],{"class":495},[482,599,520],{"class":519},[482,601,523],{"class":499},[482,603,526],{"class":495},[482,605,529],{"class":499},[482,607,532],{"class":495},[482,609,610],{"class":519}," sql",[482,612,613],{"class":552}," string",[482,615,532],{"class":495},[482,617,618],{"class":519}," args",[482,620,621],{"class":495}," ...",[482,623,624],{"class":499},"any",[482,626,549],{"class":495},[482,628,629],{"class":495}," (",[482,631,632],{"class":499},"pgconn",[482,634,526],{"class":495},[482,636,637],{"class":499},"CommandTag",[482,639,532],{"class":495},[482,641,553],{"class":552},[482,643,644],{"class":495},")\n",[482,646,648,651,653,655,657,659,661,663,665,667,669,671,673,675,677,679,681,683,686,688,690],{"class":484,"line":647},9,[482,649,650],{"class":512},"    Query",[482,652,516],{"class":495},[482,654,520],{"class":519},[482,656,523],{"class":499},[482,658,526],{"class":495},[482,660,529],{"class":499},[482,662,532],{"class":495},[482,664,610],{"class":519},[482,666,613],{"class":552},[482,668,532],{"class":495},[482,670,618],{"class":519},[482,672,621],{"class":495},[482,674,624],{"class":499},[482,676,549],{"class":495},[482,678,629],{"class":495},[482,680,414],{"class":499},[482,682,526],{"class":495},[482,684,685],{"class":499},"Rows",[482,687,532],{"class":495},[482,689,553],{"class":552},[482,691,644],{"class":495},[482,693,695,698,700,702,704,706,708,710,712,714,716,718,720,722,724,727,729],{"class":484,"line":694},10,[482,696,697],{"class":512},"    QueryRow",[482,699,516],{"class":495},[482,701,520],{"class":519},[482,703,523],{"class":499},[482,705,526],{"class":495},[482,707,529],{"class":499},[482,709,532],{"class":495},[482,711,610],{"class":519},[482,713,613],{"class":552},[482,715,532],{"class":495},[482,717,618],{"class":519},[482,719,621],{"class":495},[482,721,624],{"class":499},[482,723,549],{"class":495},[482,725,726],{"class":499}," pgx",[482,728,526],{"class":495},[482,730,731],{"class":499},"Row\n",[482,733,735],{"class":484,"line":734},11,[482,736,564],{"class":495},[482,738,740],{"class":484,"line":739},12,[482,741,571],{"emptyLinePlaceholder":570},[482,743,745],{"class":484,"line":744},13,[482,746,747],{"class":488},"\u002F\u002F 3. Az executor, ami a kettőt összeköti: minden hívás előbb tranzakciót\n",[482,749,751],{"class":484,"line":750},14,[482,752,753],{"class":488},"\u002F\u002F    keres a contextben; ha nincs, a poolon fut.\n",[482,755,757,761,764,767,769,772,774,777],{"class":484,"line":756},15,[482,758,760],{"class":759},"sTEyZ","db ",[482,762,763],{"class":495},":=",[482,765,766],{"class":759}," pg",[482,768,526],{"class":495},[482,770,771],{"class":512},"NewDB",[482,773,516],{"class":495},[482,775,776],{"class":759},"pool",[482,778,644],{"class":495},[482,780,782,785,787,789,791,794,796,798],{"class":484,"line":781},16,[482,783,784],{"class":759},"tx ",[482,786,763],{"class":495},[482,788,766],{"class":759},[482,790,526],{"class":495},[482,792,793],{"class":512},"NewTransactor",[482,795,516],{"class":495},[482,797,776],{"class":759},[482,799,644],{"class":495},[448,801,450,802,805,806,809,810,813,814,816,817,820,821,824,825,828],{},[452,803,804],{},"WithinTransaction"," tranzakciót nyit, a contextbe injektálja, és a ",[456,807,808],{},"módosított contexttel"," hívja az ",[452,811,812],{},"fn","-t. Az ",[452,815,812],{},"-en belül minden repository-hívás ugyanazt a contextet kapja tovább. A ",[452,818,819],{},"pg.DB"," (vagy bunon a ",[452,822,823],{},"bunx.From","\u002F",[452,826,827],{},"bunx.Conn"," resolver) kihalássza belőle a tranzakciót, és azon futtatja a query-t. A repositoryk szignatúrája nem változik; a tranzakció létezéséről csak az executor tud.",[468,830,832],{"id":831},"a-placeorder-service","A PlaceOrder service",[448,834,835,836,839,840,843,844,847],{},"A minta legjobb példája a ",[461,837,838],{"href":41},"shop"," rendelésfeladása. Három írásnak kell ",[456,841,842],{},"atomikusan"," megtörténnie: a rendelés beszúrásának, a készlet csökkentésének és az ",[452,845,846],{},"orderPlaced"," event outbox-sorának. Ha bármelyik hibázik, egyiknek sem szabad megmaradnia: nem létezhet rendelés levont készlet nélkül, és nem mehet ki visszaigazoló e-mail egy soha nem rögzített rendelésről.",[448,849,850,851,854,855,858,859,862],{},"A teljes metódus a modul közös ",[452,852,853],{},"core\u002F"," csomagjában él (",[452,856,857],{},"internal\u002Fmodules\u002Fshop\u002Fcore\u002F","), az ",[452,860,861],{},"api"," surface service-varrata innen hívja:",[473,864,866],{"className":475,"code":865,"language":477,"meta":478,"style":478},"type OrderService struct {\n    orders     *repository.OrderRepository\n    products   *repository.ProductRepository\n    tx         dbx.Transactor\n    dispatcher events.Dispatcher\n}\n\nfunc (s *OrderService) PlaceOrder(ctx context.Context, in PlaceOrderInput) (*Order, error) {\n    var order *Order\n    err := s.tx.WithinTransaction(ctx, func(ctx context.Context) error {\n        var err error\n        order, err = s.orders.Insert(ctx, in)                 \u002F\u002F 1. rendelés\n        if err != nil {\n            return err\n        }\n        if err := s.products.DecrementStock(ctx, in.ProductID, in.Qty); err != nil {\n            return err                                        \u002F\u002F 2. készlet\n        }\n        return s.dispatcher.Dispatch(ctx, shopevents.OrderPlaced{ \u002F\u002F 3. outbox-sor\n            OrderID: order.ID,\n            Email:   in.Email,\n        })\n    })\n    if err != nil {\n        return nil, err\n    }\n    return order, nil\n}\n",[452,867,868,880,896,910,922,934,938,942,996,1009,1050,1061,1098,1114,1122,1127,1180,1191,1196,1234,1254,1272,1278,1284,1298,1308,1314,1327],{"__ignoreMap":478},[482,869,870,872,875,878],{"class":484,"line":485},[482,871,496],{"class":495},[482,873,874],{"class":499}," OrderService",[482,876,877],{"class":495}," struct",[482,879,506],{"class":495},[482,881,882,885,888,891,893],{"class":484,"line":492},[482,883,884],{"class":759},"    orders     ",[482,886,887],{"class":495},"*",[482,889,890],{"class":499},"repository",[482,892,526],{"class":495},[482,894,895],{"class":499},"OrderRepository\n",[482,897,898,901,903,905,907],{"class":484,"line":509},[482,899,900],{"class":759},"    products   ",[482,902,887],{"class":495},[482,904,890],{"class":499},[482,906,526],{"class":495},[482,908,909],{"class":499},"ProductRepository\n",[482,911,912,915,917,919],{"class":484,"line":561},[482,913,914],{"class":759},"    tx         ",[482,916,405],{"class":499},[482,918,526],{"class":495},[482,920,921],{"class":499},"Transactor\n",[482,923,924,927,929,931],{"class":484,"line":567},[482,925,926],{"class":759},"    dispatcher ",[482,928,61],{"class":499},[482,930,526],{"class":495},[482,932,933],{"class":499},"Dispatcher\n",[482,935,936],{"class":484,"line":574},[482,937,564],{"class":495},[482,939,940],{"class":484,"line":580},[482,941,571],{"emptyLinePlaceholder":570},[482,943,944,947,949,952,954,957,959,962,964,966,968,970,972,974,977,980,982,985,988,990,992,994],{"class":484,"line":592},[482,945,946],{"class":495},"func",[482,948,629],{"class":495},[482,950,951],{"class":519},"s ",[482,953,887],{"class":495},[482,955,956],{"class":499},"OrderService",[482,958,549],{"class":495},[482,960,961],{"class":512}," PlaceOrder",[482,963,516],{"class":495},[482,965,520],{"class":519},[482,967,523],{"class":499},[482,969,526],{"class":495},[482,971,529],{"class":499},[482,973,532],{"class":495},[482,975,976],{"class":519}," in",[482,978,979],{"class":499}," PlaceOrderInput",[482,981,549],{"class":495},[482,983,984],{"class":495}," (*",[482,986,987],{"class":499},"Order",[482,989,532],{"class":495},[482,991,553],{"class":552},[482,993,549],{"class":495},[482,995,506],{"class":495},[482,997,998,1001,1004,1006],{"class":484,"line":647},[482,999,1000],{"class":495},"    var",[482,1002,1003],{"class":759}," order ",[482,1005,887],{"class":495},[482,1007,1008],{"class":499},"Order\n",[482,1010,1011,1014,1016,1019,1021,1024,1026,1028,1030,1032,1034,1036,1038,1040,1042,1044,1046,1048],{"class":484,"line":694},[482,1012,1013],{"class":759},"    err ",[482,1015,763],{"class":495},[482,1017,1018],{"class":759}," s",[482,1020,526],{"class":495},[482,1022,1023],{"class":759},"tx",[482,1025,526],{"class":495},[482,1027,804],{"class":512},[482,1029,516],{"class":495},[482,1031,520],{"class":759},[482,1033,532],{"class":495},[482,1035,538],{"class":495},[482,1037,520],{"class":519},[482,1039,523],{"class":499},[482,1041,526],{"class":495},[482,1043,529],{"class":499},[482,1045,549],{"class":495},[482,1047,553],{"class":552},[482,1049,506],{"class":495},[482,1051,1052,1055,1058],{"class":484,"line":734},[482,1053,1054],{"class":495},"        var",[482,1056,1057],{"class":759}," err ",[482,1059,1060],{"class":552},"error\n",[482,1062,1063,1066,1068,1070,1073,1075,1077,1080,1082,1085,1087,1089,1091,1093,1095],{"class":484,"line":739},[482,1064,1065],{"class":759},"        order",[482,1067,532],{"class":495},[482,1069,1057],{"class":759},[482,1071,1072],{"class":495},"=",[482,1074,1018],{"class":759},[482,1076,526],{"class":495},[482,1078,1079],{"class":759},"orders",[482,1081,526],{"class":495},[482,1083,1084],{"class":512},"Insert",[482,1086,516],{"class":495},[482,1088,520],{"class":759},[482,1090,532],{"class":495},[482,1092,976],{"class":759},[482,1094,549],{"class":495},[482,1096,1097],{"class":488},"                 \u002F\u002F 1. rendelés\n",[482,1099,1100,1104,1106,1109,1112],{"class":484,"line":744},[482,1101,1103],{"class":1102},"s7zQu","        if",[482,1105,1057],{"class":759},[482,1107,1108],{"class":495},"!=",[482,1110,1111],{"class":495}," nil",[482,1113,506],{"class":495},[482,1115,1116,1119],{"class":484,"line":750},[482,1117,1118],{"class":1102},"            return",[482,1120,1121],{"class":759}," err\n",[482,1123,1124],{"class":484,"line":756},[482,1125,1126],{"class":495},"        }\n",[482,1128,1129,1131,1133,1135,1137,1139,1142,1144,1147,1149,1151,1153,1155,1157,1160,1162,1164,1166,1169,1172,1174,1176,1178],{"class":484,"line":781},[482,1130,1103],{"class":1102},[482,1132,1057],{"class":759},[482,1134,763],{"class":495},[482,1136,1018],{"class":759},[482,1138,526],{"class":495},[482,1140,1141],{"class":759},"products",[482,1143,526],{"class":495},[482,1145,1146],{"class":512},"DecrementStock",[482,1148,516],{"class":495},[482,1150,520],{"class":759},[482,1152,532],{"class":495},[482,1154,976],{"class":759},[482,1156,526],{"class":495},[482,1158,1159],{"class":759},"ProductID",[482,1161,532],{"class":495},[482,1163,976],{"class":759},[482,1165,526],{"class":495},[482,1167,1168],{"class":759},"Qty",[482,1170,1171],{"class":495},");",[482,1173,1057],{"class":759},[482,1175,1108],{"class":495},[482,1177,1111],{"class":495},[482,1179,506],{"class":495},[482,1181,1183,1185,1188],{"class":484,"line":1182},17,[482,1184,1118],{"class":1102},[482,1186,1187],{"class":759}," err                                        ",[482,1189,1190],{"class":488},"\u002F\u002F 2. készlet\n",[482,1192,1194],{"class":484,"line":1193},18,[482,1195,1126],{"class":495},[482,1197,1199,1202,1204,1206,1209,1211,1214,1216,1218,1220,1223,1225,1228,1231],{"class":484,"line":1198},19,[482,1200,1201],{"class":1102},"        return",[482,1203,1018],{"class":759},[482,1205,526],{"class":495},[482,1207,1208],{"class":759},"dispatcher",[482,1210,526],{"class":495},[482,1212,1213],{"class":512},"Dispatch",[482,1215,516],{"class":495},[482,1217,520],{"class":759},[482,1219,532],{"class":495},[482,1221,1222],{"class":499}," shopevents",[482,1224,526],{"class":495},[482,1226,1227],{"class":499},"OrderPlaced",[482,1229,1230],{"class":495},"{",[482,1232,1233],{"class":488}," \u002F\u002F 3. outbox-sor\n",[482,1235,1237,1240,1243,1246,1248,1251],{"class":484,"line":1236},20,[482,1238,1239],{"class":759},"            OrderID",[482,1241,1242],{"class":495},":",[482,1244,1245],{"class":759}," order",[482,1247,526],{"class":495},[482,1249,1250],{"class":759},"ID",[482,1252,1253],{"class":495},",\n",[482,1255,1257,1260,1262,1265,1267,1270],{"class":484,"line":1256},21,[482,1258,1259],{"class":759},"            Email",[482,1261,1242],{"class":495},[482,1263,1264],{"class":759},"   in",[482,1266,526],{"class":495},[482,1268,1269],{"class":759},"Email",[482,1271,1253],{"class":495},[482,1273,1275],{"class":484,"line":1274},22,[482,1276,1277],{"class":495},"        })\n",[482,1279,1281],{"class":484,"line":1280},23,[482,1282,1283],{"class":495},"    })\n",[482,1285,1287,1290,1292,1294,1296],{"class":484,"line":1286},24,[482,1288,1289],{"class":1102},"    if",[482,1291,1057],{"class":759},[482,1293,1108],{"class":495},[482,1295,1111],{"class":495},[482,1297,506],{"class":495},[482,1299,1301,1303,1306],{"class":484,"line":1300},25,[482,1302,1201],{"class":1102},[482,1304,1305],{"class":495}," nil,",[482,1307,1121],{"class":759},[482,1309,1311],{"class":484,"line":1310},26,[482,1312,1313],{"class":495},"    }\n",[482,1315,1317,1320,1322,1324],{"class":484,"line":1316},27,[482,1318,1319],{"class":1102},"    return",[482,1321,1245],{"class":759},[482,1323,532],{"class":495},[482,1325,1326],{"class":495}," nil\n",[482,1328,1330],{"class":484,"line":1329},28,[482,1331,564],{"class":495},[448,1333,1334,1335,1338,1339,1342,1343,1346,1347,1350],{},"(A ",[452,1336,1337],{},"shopevents"," a modul saját event-csomagjának aliasa: ",[452,1340,1341],{},"internal\u002Fmodules\u002Fshop\u002Fevents",", az ",[452,1344,1345],{},"add event"," generálja.) Mind a három hívás ugyanazt a ",[452,1348,1349],{},"pgx.Tx","-et oldja fel a contextből:",[1352,1353,1354,1372],"ul",{},[1355,1356,1357,1358,1361,1362,1365,1366,1371],"li",{},"az ",[452,1359,1360],{},"orders.Insert"," és a ",[452,1363,1364],{},"products.DecrementStock"," a ",[461,1367,1369],{"href":1368},"\u002Fhu\u002Fdbx\u002Fpg#db--az-executor-ami-a-contextet-figyeli",[452,1370,819],{},"-n keresztül;",[1355,1373,1374,1375,1377,1378,1383,1384,1386,1387,1390,1391,1394],{},"a ",[452,1376,1208],{}," egy ",[461,1379,1380],{"href":73},[452,1381,1382],{},"outbox.NewDispatcher",", amelynek store-ja szintén a ",[452,1385,819],{},"-n ír. Az event ",[456,1388,1389],{},"ugyanabban a tranzakcióban"," kerül az ",[452,1392,1393],{},"outbox_events"," táblába, mint az üzleti írások. Commitkor együtt válnak láthatóvá; rollbackkor az event sem létezik. Ez a tranzakciós outbox lényege.",[448,1396,1397,1398,1400,1401,1404,1405,1407,1408,1412],{},"Ha a ",[452,1399,1146],{}," ",[452,1402,1403],{},"insufficient_stock"," hibával tér vissza, a már lefutott ",[452,1406,1084],{}," is visszagördül, és az event sosem kerül kézbesítésre. A hiba az ",[461,1409,1410],{"href":225},[452,1411,358],{}," láncon át problem+json válasszá képződik le.",[468,1414,1416],{"id":1415},"szemantika","Szemantika",[448,1418,1419,1420,1423,1424,1427],{},"A garanciák, amiket a dbx saját integrációs tesztjei rögzítenek (",[452,1421,1422],{},"go test -tags=integration .\u002Fdbx\u002Fpg\u002F"," és ",[452,1425,1426],{},".\u002Fdbx\u002Fbunx\u002F",", valós PostgreSQL ellen):",[1352,1429,1430,1442,1448,1458],{},[1355,1431,1432,1441],{},[456,1433,1434,1435,1400,1437,1440],{},"Commit csak akkor, ha az ",[452,1436,812],{},[452,1438,1439],{},"nil","-t ad vissza."," Bármilyen hiba rollback, a hiba változatlanul propagál a hívó felé.",[1355,1443,1444,1447],{},[456,1445,1446],{},"Panic rollbackel és újradobódik."," Egy handler-pánik nem hagyhat félbe tranzakciót.",[1355,1449,1450,1453,1454,1457],{},[456,1451,1452],{},"A rollback a lemondott contextet is túléli:"," a cleanup ",[452,1455,1456],{},"context.WithoutCancel","-lel fut, így egy kérés-timeout nem akadályozza meg a tranzakció rendezett visszagörgetését.",[1355,1459,1460,1466],{},[456,1461,1462,1463,1465],{},"A beágyazott ",[452,1464,804],{}," csatlakozik"," a külső tranzakcióhoz: lapos nesting, savepoint nélkül. A commitot\u002Frollbacket mindig a legkülső hívás birtokolja: ha a belső blokk sikeres, de a külső utána hibázik, a belső írások is visszagördülnek.",[448,1468,1469,1470,1472],{},"A lapos nesting gyakorlati következménye: egy service-metódus szabadon hívhat másik service-metódust, ami maga is ",[452,1471,804],{},"-t használ, a belső hívás észrevétlenül a külső tranzakció része lesz. Nem kell „tranzakción belül vagyunk-e már?\" logikát írni.",[1474,1475,1476,1477,1480,1481,1483],"warning",{},"Savepoint nincs: a belső blokk hibája a ",[456,1478,1479],{},"teljes"," tranzakciót görgeti vissza, nem csak a belső írásokat. Ha részleges visszagörgetésre van szükséged, az külön tranzakció: futtasd a ",[452,1482,804],{},"-ön kívül.",[468,1485,1487],{"id":1486},"miért-a-context-és-nem-paraméter","Miért a context, és nem paraméter?",[448,1489,1490,1491,1493,1494,1496,1497,1500],{},"A klasszikus alternatíva a tranzakció kézi továbbadása: minden repository-metódus kap egy ",[452,1492,1023],{},"-paramétert, vagy két változatban létezik (",[452,1495,1084],{}," \u002F ",[452,1498,1499],{},"InsertTx","). Ez három helyen fáj:",[1502,1503,1504,1518,1527],"ol",{},[1355,1505,1506,1509,1510,1513,1514,1517],{},[456,1507,1508],{},"Minden szignatúra megfertőződik."," A ",[452,1511,1512],{},"ListProducts(ctx, params)"," helyett ",[452,1515,1516],{},"ListProducts(ctx, tx, params)",", akkor is, ha az adott hívásnak sosem lesz tranzakciója.",[1355,1519,1520,1523,1524,1526],{},[456,1521,1522],{},"A rétegek összecsúsznak."," A service-nek driver-típust (",[452,1525,1349],{},") kellene importálnia és továbbadnia, pedig a service-réteg dolga az üzleti logika, nem a kapcsolat-menedzsment.",[1355,1528,1529,1532,1533,1536],{},[456,1530,1531],{},"A keresztvágó kód kimarad."," Az ",[461,1534,1535],{"href":73},"outbox dispatcher"," a kit kódja: nem tudhat a te repositoryjaid tranzakció-paraméteréről. A contextből viszont ugyanúgy kiolvassa a tranzakciót, mint a saját repóid.",[448,1538,1539,1540,1543],{},"A context-hordozás pontosan az a fajta implicit állapot, amire a ",[452,1541,1542],{},"context.Context"," való: kérés-szkópú, a hívási láncon lefelé utazó, keresztvágó adat. A Go standard library ugyanígy hordozza a trace-eket, a deadline-okat és a cancel-jelet.",[468,1545,1547],{"id":1546},"implementáció-függetlenség","Implementáció-függetlenség",[448,1549,1550,1551,1554,1555,1558,1559,1400,1562,1565,1566,1570],{},"A fenti service-kód egyetlen sora sem pgx-specifikus: a ",[452,1552,1553],{},"dbx.Transactor","-tól és a saját repository-interfészeitől függ. Egy ",[452,1556,1557],{},"--db bun"," projektben ugyanez a metódus változatlanul fordul és fut. A ",[452,1560,1561],{},"main.go",[452,1563,1564],{},"bunx.NewTransactor(bunDB)","-t injektál, a repositoryk belseje pedig a ",[461,1567,1569],{"href":1568},"\u002Fhu\u002Fdbx\u002Fbunx#repositoryk","bun resolvereket"," használja. A tranzakció-határ kijelölése a service-rétegé; hogy alatta mi hordozza a tranzakciót, az bekötési részlet.",[468,1572,1574],{"id":1573},"egy-transactor-kapcsolatonként","Egy Transactor kapcsolatonként",[448,1576,1577,1578,1581,1582,1584,1585,1589,1590,1592,1593,1400,1596,1599,1600,1603,1604,1607,1608,1361,1610,1613,1614,1616,1617,1620,1621,1623],{},"Egy ",[452,1579,1580],{},"Transactor"," mindig egyetlen kapcsolatra érvényes: a ",[452,1583,804],{}," az általa becsomagolt poolon nyit tranzakciót, és a saját implementáció-specifikus kulcsa alatt injektálja a contextbe. Egy ",[461,1586,1588],{"href":1587},"\u002Fhu\u002Fdbx\u002Foverview#neves%C3%ADtett-kapcsolatok","nevesített kapcsolathoz"," kötött repository más ",[452,1591,1580],{},"-t kap (a ",[452,1594,1595],{},"Dependencies",[452,1597,1598],{},"\u003CNév>Transactor"," mezőjét), mint a default: ha a default ",[452,1601,1602],{},"Transactor.WithinTransaction","-jét egy nevesített kapcsolat repository-hívása köré teszed, az ",[456,1605,1606],{},"nem"," kerül ugyanabba a tranzakcióba; a saját kapcsolatán fut, összehangolás nélkül. Ez az is az oka, hogy egy kapcsolat connectora (pgx vagy bun) hívásonként nem változhat: a ",[452,1609,1349],{},[452,1611,1612],{},"bun.Tx"," két különböző típus, két különböző context-kulcs alatt, ezek keverése egy kapcsolaton belül épp azt tenné tönkre, amiért a ",[452,1615,1580],{}," létezik. Ha két repositorynak együtt kell commit-olnia vagy rollbackelnie, mindkettőnek ",[456,1618,1619],{},"ugyanazon"," kapcsolat ",[452,1622,1580],{},"-ja mögött kell állnia.",[468,1625,1627],{"id":1626},"használt-patternek","Használt patternek",[448,1629,1630,1631,1634,1635,1638,1639,1641],{},"Ez az oldal a ",[461,1632,238],{"href":1633},"\u002Fhu\u002Fconcepts\u002Fdesign-patterns#unit-of-work--tranzakci%C3%B3-a-contextben"," katalógus ",[456,1636,1637],{},"Unit of Work \u002F tranzakció a contextben"," bejegyzésének teljes kifejtése: a ",[452,1640,1553],{}," interfész és a panic-safe rollback-logika ott, kódrészlettel.",[1643,1644,1645],"style",{},"html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}",{"title":478,"searchDepth":492,"depth":492,"links":1647},[1648,1649,1650,1651,1652,1653,1654],{"id":470,"depth":492,"text":471},{"id":831,"depth":492,"text":832},{"id":1415,"depth":492,"text":1416},{"id":1486,"depth":492,"text":1487},{"id":1546,"depth":492,"text":1547},{"id":1573,"depth":492,"text":1574},{"id":1626,"depth":492,"text":1627},"Kereszt-repository tranzakciók a contextben, plumbing nélkül.","md",null,{},{"icon":425},{"title":422,"description":1655},"ZOrPgnHz6QbSrqbp4Ub1Ei_IXlOlzAmmXDMYdohqFKs",[1663,1665],{"title":418,"path":419,"stem":420,"description":1664,"icon":47,"children":-1},"Az opcionális bun adapter: query builder és struct-modellek, a Transactor kontrakt változatlanul.",{"title":427,"path":428,"stem":429,"description":1666,"icon":318,"children":-1},"Idempotens alapadat-betöltés migráció után, first-or-create-cel, opcionális feltétellel és multi-tenant támogatással.",1785445877267]