cari

Rumah  >  Soal Jawab  >  teks badan

java - 事务 与 更新丢失的问题?

先查询某一行的值,然后在更新这个值。在高并发的情况下,A 用户 查出来的值比如是 8,这时候按着8进行处理过程中,有另外的用户B,将这个值改成了10,当A用户再去更新的时候,就会造成数据的更新丢失。

通过对查询更新方法设置事务,加入防重复读的隔离级别,也是解决不了更新丢失问题的。防重复读,只能保证第一次读到是8,后面在怎么读这条记录,结果都是8。

解决这个问题,在mysql 数据库层面,只有用for update (悲观锁)或是乐观锁来锁住这一行记录。

问题是,对于事务与mysql悲观锁的理解有点混沌了。请高人给指点迷津。

高洛峰高洛峰2888 hari yang lalu552

membalas semua(4)saya akan balas

  • 大家讲道理

    大家讲道理2017-04-18 10:31:12

    Mendayakan tahap pengasingan lalai mysql dalam keadaan transaksi sudah boleh menyelesaikan masalah ini.

    balas
    0
  • 阿神

    阿神2017-04-18 10:31:12

    Contohnya
    SET AUTOCOMMIT=0; MULAKAN KERJA;
    PILIH kuantiti DARI produk WHERE id=3 UNTUK KEMASKINI;
    KEMASKINI produk SET kuantiti = '1' WHERE id=3; KERJA ;

    Anda boleh menghidupkan perkara.

    Kemudian tambah FOR UPDATE apabila membaca rekod ini, dan kunci rekod ini
    Menggunakan FOR UPDATE mesti menggunakan transaksi, kerana tidak menggunakan transaksi adalah serupa dengan tidak menggunakan FOR UPDATE, dalam transaksi Selepas menggunakan FOR UPDATE, sebelum COMMIT/ROLLBACK,
    jika sesi lain membaca baris ini dengan id=3, mereka akan menunggu selama-lamanya, menunggu transaksi anda tamat dan membaca baris baharu
    diikuti dengan UNTUK KEMASKINI Sebaiknya gunakan id = xx atau id dalam (xx,xx) jika tidak pangkalan data akan diturunkan taraf kepada jadual kunci

    balas
    0
  • PHPz

    PHPz2017-04-18 10:31:12

    DI MANA syarat Riga:

    SELECT quantity FROM products WHERE id=3; 假设读到的quantity为8
    UPDATE products SET quantity = '10' WHERE id=3 AND quantity=8;

    balas
    0
  • 大家讲道理

    大家讲道理2017-04-18 10:31:12

    Terdapat 4 peringkat urus niaga
    Baca komited, baca tidak komited, boleh dibaca semula, bersiri
    Huraikan keperluan anda dengan teliti dan izinkan saya lihat!

    balas
    0
  • Batalbalas