java - mysql事务隔离的问题?多线程并发怎么保证可靠?
高洛峰
高洛峰 2017-04-17 17:55:17
0
5
553

mysql采用默认事务隔离级别REPEATABLE-READ;
然后我分别执行以下内容:
1、


2、使用jdbc访问数据库:

3、这时候打印结果,发现线程进入阻塞,一直卡在这里

也就是说我开启的另一个事务仍然能读取到数据,只是在最后执行executeUpdate的时候才被锁定不能执行
4、命令行执行commit


5、结果命令行操作被jdbc操作替换掉,数据改为4。

这不就是说REPEATABLE-READ仍然出现了丢失更新,而且没有行锁定吗?
事务与并发到底是什么区别,我在测试多线程执行以上jdbc操作时,发现最后得到的结果总是不对。例我开十个线程,每个都对数据+1,结果可能只加了5.所以在并发情况下怎么做才能保证数据的安全?

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

membalas semua(5)
PHPzhong

Jika hanya dinaikkan satu, nilai nombor tidak akan diperoleh melalui pilih, dan nilai yang diperolehi oleh pilih mungkin nilai lama; . Nombor di sini akan menjadi yang terkini Kaedah ini boleh mengelakkan kehilangan prestasi bersiri yang lengkap untuk kemas kini.

刘奇

BACA BOLEH DIULANG boleh menyebabkan bacaan hantu
Jika anda ingin memastikan keselamatan mutlak, anda hanya boleh menetapkan tahap pengasingan kepada BOLEH BERSERI
Dengan cara ini, semua urus niaga hanya boleh dilaksanakan secara berurutan, dan secara semula jadi akan ada tiada masalah kerana konkurensi Ia terjejas, tetapi prestasi akan jatuh banyak.

Jika anda tidak mahu prestasi menurun tetapi juga mahu mengawalnya supaya ia tidak salah, pendekatan yang lebih biasa sekarang ialah menggunakan kawalan versi yang lebih baharu.
Kekalkan medan sebagai UpdateVersion, versi kemas kini juga dihantar sebagai parameter Tambah sebagai contoh where id=? and update_version = ? dalam pernyataan bersyarat.
Ini boleh dikawal supaya hanya seorang boleh mengemas kini satu versi pada satu masa.

洪涛

Melalui eksperimen, saya mendapati bahawa saya telah memahami masalah saya pada tahap tertentu.

Saya telah dikelirukan dengan maklumat yang salah tentang tahap pengasingan transaksi sebelum ini, memikirkan tahap BACA-BACA ULANGAN dan tahap BOLEH BERSIRI boleh menyelesaikan masalah kemas kini yang hilang, tetapi sebenarnya tidak boleh.
Oleh kerana pilihan mysql ... dari jadual; pernyataan tidak akan disekat tanpa mengira tahap pengasingan,

事务A读取 id为1 number = 3 ,执行更新操作 number设为1;
事务B读取 id为1 number = 3, 执行+1操作  更新--进入阻塞

Di bawah tahap pengasingan, kunci tulis (kunci eksklusif) hanya akan menunggu keluaran semasa mengemas kini data, jadi berbilang urutan boleh membaca nombor=3 pada masa yang sama Pengubahsuaian berdasarkan ini pasti akan membawa kepada kehilangan kemas kini.

Jadi penyelesaiannya ialah menambah penguncian pesimis atau mekanisme penguncian optimistik pada program.
Kunci pesimis menggunakan pilih ... untuk kemas kini,

事务A:  select ... for update,执行更新操作,
事务B:  select ... for update --阻塞

Pada masa ini, operasi baca transaksi B tidak akan dilaksanakan Hanya apabila komit transaksi A selesai, transaksi B boleh terus dilaksanakan, yang bersamaan dengan melaksanakan secara bersiri satu demi satu.

Penguncian optimis biasanya digunakan untuk kawalan versi atau kawalan cap masa,

事务A:执行 此时版本为 1;执行完update ...set version=2 where version = 1;
事务B:执行 此时版本为 1;执行完update ...set version=2 where version = 1;

Pada masa ini, transaksi B mendapati bahawa versi=1 tidak lagi wujud, kerana transaksi A mula-mula menyelesaikan pelaksanaan dan mengemas kini pangkalan data, menetapkan medan versi kepada 2. Ini akan menyebabkan penyerahan transaksi gagal, dan kita perlu tentukan situasi abnormal dalam program Bagaimana untuk meneruskan di bawah.

Di atas adalah pemahaman saya semasa untuk MVCC (Multiple Version Concurrency Control) yang disokong oleh MySQL sendiri, saya masih tidak tahu bagaimana untuk melaksanakan pengendalian pengecualian penguncian optimistik . Ia mungkin berdasarkan senario perniagaan tertentu Gunakan pendekatan yang berbeza.

刘奇

Jika ia ringkas Select, ia akan dianggap sebagai operasi pertanyaan mudah, jadi ia tidak akan digantung.
Jika anda ingin melakukan transaksi pada baris tertentu, anda harus menggunakan format Select dahulu apabila Select ... For Update.
Menggunakan For Update akan mengunci baris yang dipilih Apabila transaksi lain dijalankan, ia akan digantung pada Select ... For Update urus niaga tersebut dan menunggu selesainya transaksi semasa sebelum meneruskan. Ini memastikan tiada orang tengah antara pertanyaan dan penulisan.

巴扎黑

Dikawal dengan kunci.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan