Dalam persekitaran berbilang pengguna, Hibernate menyediakan penguncian optimistik dan penguncian pesimis untuk memastikan integriti data. Penguncian optimis menganggap bahawa apabila urus niaga mengubah suai data, urus niaga lain tidak akan bercanggah Ia dilaksanakan melalui semakan medan versi dan mempunyai prestasi tinggi serta berskala, tetapi boleh menyebabkan kehilangan data. Penguncian pesimis menganggap konflik antara urus niaga dan dilaksanakan melalui kunci pangkalan data, yang boleh menghalang pengubahsuaian serentak, tetapi mempunyai prestasi dan kebolehskalaan yang lebih rendah. Pilihan khusus bergantung pada kekerapan pengubahsuaian serentak dan kepentingan integriti data.
Penguncian Optimis dan Penguncian Pesimis dalam Hibernate
Dalam persekitaran berbilang pengguna, integriti data adalah penting. Hibernate menyediakan dua mekanisme penguncian untuk memastikan integriti akses serentak: penguncian optimistik dan penguncian pesimis.
Kunci Optimis
Penguncian optimistik adalah berdasarkan andaian bahawa apabila transaksi mengubah suai data, transaksi lain tidak akan membuat pengubahsuaian yang bercanggah pada masa yang sama. Jika andaian ini berlaku, maka urus niaga boleh dilakukan dengan cepat tanpa menyebabkan sebarang pertikaian kunci.
Kaedah pelaksanaan: Hibernate menggunakan medan versi untuk melaksanakan penguncian optimistik. Setiap kali entiti diubah suai, medan versi ditambah. Apabila transaksi cuba untuk melakukan, Hibernate menyemak sama ada medan versi semasa sepadan dengan medan versi dalam pangkalan data. Jika medan versi tidak sepadan, transaksi akan ditarik balik dan pengecualian StaleObjectStateException
akan dibuang. StaleObjectStateException
异常。
优点:
缺点:
悲观锁
悲观锁基于这样的假设:当一个事务对数据进行修改时,其他事务可能同时对同一数据进行冲突的修改。因此,悲观锁会立即获取锁,以防止并发访问。
实现方式: Hibernate 主要使用数据库级的锁来实现悲观锁。当一个事务开始时,它可以获得一个读锁或写锁,以防止其他事务对数据进行并发修改。
优点:
缺点:
实战案例:
考虑一个电商网站,其中有多个用户同时浏览同一商品详情页。为了防止并发购买导致库存错误,可以使用乐观锁:
@Entity public class Product { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; private int quantity; @Version private long version; }
当一个用户尝试购买该商品时,Hibernate 会增加version
字段。如果此时另一个用户也尝试购买,那么当第一个用户提交事务时,Hibernate 会检测到version
Kelebihan:
version
. Jika pengguna lain juga cuba membeli pada masa ini, apabila pengguna pertama melakukan transaksi, Hibernate akan mengesan ketidakpadanan dalam medan version
dan melancarkan pembelian pengguna pertama. 🎜🎜🎜Pertimbangan lain: 🎜🎜🎜🎜Untuk data yang kerap diubah suai serentak, penguncian pesimis adalah lebih sesuai. Untuk data yang jarang diubah suai serentak, penguncian optimistik berprestasi lebih baik. 🎜🎜Hibernate juga menyokong dengan jelas menyatakan jenis kunci menggunakan LockModeEnum. 🎜🎜Jenis dan gelagat kunci pangkalan data mungkin berbeza-beza, yang boleh menjejaskan prestasi dan gelagat kunci pesimis. 🎜🎜Atas ialah kandungan terperinci Bagaimanakah Hibernate mengendalikan penguncian optimistik dan penguncian pesimis?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!