+1 امتیاز
قبل در برنامه نویسی توسط (778 امتیاز)
برچسب گذاری دوباره قبل توسط
در JPA چه فرقی بین commit و flush وجود دارد؟

2 پاسخ

+1 امتیاز
قبل توسط (778 امتیاز)
در هر دو تغییرات در دیتابیس منعکس می شوند اما در flush بعد از انعکاس هنوز شی‌ء در تراکنش وجود دارد ولی در commit بعد از این که تغییرات در دیتابیس ساخته شد، تراکنش تمام می شود. flush برای مثال در batch update می تواند مفید باشد.
+1 امتیاز
قبل توسط (693 امتیاز)
ویرایش شده قبل توسط

بصورت پیش فرض persistence context در آخر هر تراکنش با دیتابیس هماهنگ ( sync ) است ولی در برخی مواقع شما نیاز دارید تا تغییرات در مموری نگه داشته شود و تنها زمانی در پایگاه داده اعمال شود که شما می خواهید بعنوان مثال زمانی که  کاربر وارد فرم ویرایش می شود

1. از پایگاه داده entity بر اساس شناسه آی دی لود می شود و مقادیر فرم ست می شود.
2. کاربر مقادیر را تغییر می دهد و پس از بروز رسانی ، فقط تغییرات در پایگاه داده بروز می شود .

Commit

اگر شما از هایبرنیت استفاده نکنید یک کوئری هنگام لود شدن فرم باید اجرا کنید و یک کوئری دیگر هنگام بروز رسانی ( چونکه تراکنش بعد از render شدن صفحه بسته می شود یعنی commit )

 Flush

هایبرنیت یک امکان ویژه ای دارد که بقیه ی پیاده سازی های JPA ندارند و آن این است که شما می توانید با تنظیم flushmode از AUTO به manual فقط و فقط تغییرات را بدون اینکه نراکنش را ببندید  تغییرات را با  flush با دیتابیس هماهنگ کنید در این حالت دیگر نیازی به کوئری اضافه نیست چون آبجکت در persistence context وجود دارد و فقط dirty شده اما در حالت قبل آبجکت به اصطلاح detach و تراکنش بسته می شود.

یک مثال فنی دیگر : در فریم ورک هایی مثل اسپرینگ از آنجاییکه هر تراکنش به ازای هر متد است ( تراکنش در ابتدای متد شروع و در پایان متد تمام می شود ) و تراکنش توسط فریم ورک اسپرینگ هندل می شود .  تراکنش با پایان هر متد commit می شود شما نمی توانید سناریو ی زیر را انجام دهید

1. در یک متد عملیات insert را انجام دهید تغییرات را flush کنید
2. سپس مقادیر وارد شده را select بزنید 

@Transactional
public void multipleTaskInOnTransaction()
{
    entityManager.persist(user);
    entityManager.flush();
    //user should be available in database but it is not
   jdbcTemplate.query("select * from users");
   //returns nothing until you exit the methods
}

اما در فریم ورک های بهتر اینکار براحتی قابل انجام است .

سوالات مشابه

0 امتیاز
1 پاسخ 535 بازدید
+1 امتیاز
1 پاسخ 1.1هزار بازدید
سوال شده 5 سال قبل در برنامه نویسی توسط masoud shahhosseini_ (45 امتیاز)
+1 امتیاز
1 پاسخ 394 بازدید
سوال شده 6 سال قبل در برنامه نویسی توسط یوری (426 امتیاز)
0 امتیاز
3 پاسخ 875 بازدید
سوال شده 6 سال قبل در برنامه نویسی توسط یوری (426 امتیاز)
0 امتیاز
0 پاسخ 2.8هزار بازدید
0 امتیاز
0 پاسخ 967 بازدید
+1 امتیاز
1 پاسخ 750 بازدید
0 امتیاز
1 پاسخ 503 بازدید
سوال شده 8 سال قبل در برنامه نویسی توسط Saeed Zarinfam (1.1هزار امتیاز)
0 امتیاز
1 پاسخ 388 بازدید
سوال شده 8 سال قبل در برنامه نویسی توسط Saeed Zarinfam (1.1هزار امتیاز)
0 امتیاز
1 پاسخ 451 بازدید
...