mysql的并发控制原理
Mysql是主流的开源关系型数据库,提供高性能的数据存储服务。在做后端开发时,
有时会遇到性能瓶颈,这些瓶颈有时并不是来自应用本身,而是来自数据库层面。
所以所以掌握Mysql的一些底层原理有助于我们更好地理解Mysql,对Mysql进行性能调优,
从而开发高性能的后端服务。
1、mysql的逻辑框架
mysql逻辑框架图如下:
最上层是处理客户端过来的连接的。
主要做连接处理、授权认证、安全等。Mysql在这一层维护了一个线程池,用于处理来自客户端的连接。Mysql可以使用用户名密码认证,
也可以使用SSL基于X.509证书认证。
第二层由三部分组成:查询缓存、解析器、优化器。解析器用来解析SQL语句,优化器会对解析之后的语句进行优化。
在解析查询前,服务器会先检查查询缓存,如果能在其中找到对应的查询结果,则无需再进行查询解析、优化等过程,直接返回查询结果。存储过程、触发器、视图等都在这一层实现。
第三层是存储引擎,存储引擎负责在MySQL中存储数据、提取数据、开启一个事务等等。存储引擎通过API与上层进行通信,这些API屏蔽了不同存储引擎之间的差异,使得这些差异对上层查询过程透明。存储引擎不会去解析SQL。mysql最常用的存储引擎是InnoDB。
2、mysql的并发控制
如果多个线程同时操作数据,就有可能引发并发控制的问题。
2-1、读写锁
如果多个线程都只是读数据,其实可以一起读,不会互相影响,这个时候应该使用“读锁”,也称为共享锁。
获取读锁的线程之间互相不会阻塞,可以同时读取一个资源。
如果有一个线程需要写数据,则应该使用“写锁”,也成为排它锁。
写锁会阻塞其它的写锁和读锁,直至写操作完成。
2-2、锁粒度
首先明确一个概念:在给定的资源上,需要加锁的数据越少,系统能够承载的并发量就越高。
但加锁也是需要消耗资源的,如果系统花费大量的时间来管理锁,而不是存取数据,
那么系统的性能可能会因此受影响。
所以一个好的“锁策略”就是要在锁的开销和数据的安全性之间寻求平衡,Mysql支持多个存储引擎的架构,
每种存储引擎都可以实现自己的锁策略和锁粒度。
2-3、表锁和行锁
表锁顾名思义就是锁住整张表。表锁开销比较小。对表加写锁后,其它用户对这张表的所有读写操作都会被阻塞。
在Mysql中,尽管存储引擎可以提供自己的锁,但Mysql有时候也会使用表锁,比如ALTER TABLE之类的语句。
写锁比读锁有更高的优先级,因此一个写锁请求可能会插入到读锁队列的前面。
行级锁即锁住整行,可以最大程度地支持并发处理,但加解锁的开销也会比较大。行级锁只在储存引擎层实现,
所有的存储引擎都以自己的方式实现了行级锁。
3、MVCC
MVCC即“多版本并发控制”,可以认为MVCC是行级锁的一个变种,但是它在很多情况下避免了加锁操作,
因此开销更低。
主流的关系型数据库都实现了MVCC,但实现机制各有不同。实际上MVCC也没有一个统一的标准。
但大都实现了非阻塞的读操作,写操作也只是锁定必要的行。
MVCC保证的是每个事务里面在执行期间看到的数据都是一致的。
但不同的事务由于开始的时间不同,所以可能对同一张表,同一时刻看到的数据是不一样的。
在Mysql的InnoDB引擎,是通过给每行记录后面保存两个隐藏的列来实现的。
一个是保存行的创建时间,另一个保存了行的过期时间(或删除时间)。
实际上存储的并不是实际的一个时间戳,而是‘系统版本号’。
每次开启一个事务,系统版本号都会递增。事务开始时,系统版本号会作为事务的版本号,用来和查询到的行的版本号进行比较。
下面分别介绍常见的CRUD操作中版本号是怎么工作的:
INSERT
保存当前系统版本好的作为行版本号
DELETE
保存当前的系统版本号到这行数据的“删除版本”。
UPDATE
插入一行新纪录,保存当前系统版本号作为航版本号,同时保存当前系统版本号到原来的行的“删除版本”。
SELECT
只查找版本早于当前事务版本的行。这样可以保证事务读取的行,要么之前就存在,
要么是这个事务本身自己插入或者修改的。
行的“删除版本”要么未定义,要么大于当前事务版本号。这样可以确保事务读取到的行,
在事务之前没有被删除。
MVCC只在REPEATABLE READ
和READ COMMITTED
两个隔离级别下工作,其它两个隔离级别不能工作。
因为READ UNCOMMITTED
总是读取最新的数据防,而不是符合当前事务版本的数据行。而SERIALIZABLE
则会对所有读取的行都加锁。
以上是为大家整理的关于并发控制的一些问题,更多相关问题请访问PHP中文网相关教程。
推荐视频教程:https://www.php.cn/course/list/51/type/2.html
Atas ialah kandungan terperinci mysql的并发控制原理. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



Rangka kerja koleksi Java mengurus konkurensi melalui koleksi selamat benang dan mekanisme kawalan konkurensi. Koleksi selamat benang (seperti CopyOnWriteArrayList) menjamin ketekalan data, manakala koleksi tidak selamat benang (seperti ArrayList) memerlukan penyegerakan luaran. Java menyediakan mekanisme seperti kunci, operasi atom, ConcurrentHashMap dan CopyOnWriteArrayList untuk mengawal konkurensi, dengan itu memastikan integriti dan konsistensi data dalam persekitaran berbilang benang.

Dalam pembangunan C#, pengaturcaraan berbilang benang dan kawalan konkurensi amat penting dalam menghadapi peningkatan data dan tugasan. Artikel ini akan memperkenalkan beberapa perkara yang perlu diberi perhatian dalam pembangunan C# dari dua aspek: pengaturcaraan berbilang benang dan kawalan konkurensi. 1. Pengaturcaraan berbilang benang Pengaturcaraan berbilang benang ialah teknologi yang menggunakan sumber berbilang teras CPU untuk meningkatkan kecekapan program. Dalam program C#, pengaturcaraan berbilang benang boleh dilaksanakan menggunakan kelas Thread, kelas ThreadPool, kelas Tugas dan Async/Await. Tetapi apabila melakukan pengaturcaraan berbilang benang

Pengaturcaraan serentak dilaksanakan dalam Go through Goroutine dan alat kawalan serentak (seperti WaitGroup, Mutex), dan perpustakaan pihak ketiga (seperti sync.Pool, sync.semaphore, queue) boleh digunakan untuk melanjutkan fungsinya. Perpustakaan ini mengoptimumkan operasi serentak seperti pengurusan tugas, sekatan akses sumber dan peningkatan kecekapan kod. Contoh menggunakan perpustakaan baris gilir untuk memproses tugasan menunjukkan aplikasi perpustakaan pihak ketiga dalam senario konkurensi sebenar.

Strategi kawalan serentak dan teknik pengoptimuman prestasi http.Transport dalam bahasa Go Dalam bahasa Go, http.Transport boleh digunakan untuk mencipta dan mengurus klien permintaan HTTP. http.Transport digunakan secara meluas dalam perpustakaan standard Go dan menyediakan banyak parameter boleh dikonfigurasikan, serta fungsi kawalan konkurensi. Dalam artikel ini, kami akan membincangkan cara menggunakan strategi kawalan serentak http.Transport untuk mengoptimumkan prestasi dan menunjukkan beberapa kod contoh yang berfungsi. satu,

Kesan kawalan serentak pada prestasi GoLang: Penggunaan memori: Goroutine menggunakan memori tambahan dan sejumlah besar goroutine boleh menyebabkan keletihan memori. Overhed penjadualan: Membuat goroutines akan menjana overhed penjadualan, dan penciptaan dan pemusnahan gorouti yang kerap akan menjejaskan prestasi. Persaingan kunci: Penyegerakan kunci diperlukan apabila berbilang gorout mengakses sumber yang dikongsi persaingan akan membawa kepada kemerosotan prestasi dan kependaman lanjutan. Strategi pengoptimuman: Gunakan gorouti dengan betul: hanya buat gorouti apabila perlu. Hadkan bilangan goroutine: gunakan saluran atau penyegerakan.WaitGroup untuk mengurus konkurensi. Elakkan pertikaian kunci: gunakan struktur data tanpa kunci atau kurangkan masa memegang kunci

Bagaimana untuk menggunakan kunci yang diedarkan untuk mengawal akses serentak dalam MySQL? Dalam sistem pangkalan data, akses serentak yang tinggi adalah masalah biasa, dan kunci yang diedarkan adalah salah satu penyelesaian biasa. Artikel ini akan memperkenalkan cara menggunakan kunci teragih dalam MySQL untuk mengawal akses serentak dan menyediakan contoh kod yang sepadan. 1. Kunci Diedarkan Prinsip boleh digunakan untuk melindungi sumber yang dikongsi untuk memastikan bahawa hanya satu utas boleh mengakses sumber pada masa yang sama. Dalam MySQL, kunci teragih boleh dilaksanakan dengan cara berikut: Cipta fail bernama lock_tabl

MySQL dan Oracle: Perbandingan sokongan untuk kawalan serentak berbilang versi dan ketekalan data Pengenalan: Dalam aplikasi intensif data hari ini, sistem pangkalan data memainkan peranan teras dalam merealisasikan penyimpanan dan pengurusan data. MySQL dan Oracle ialah dua sistem pengurusan pangkalan data hubungan (RDBMS) yang terkenal yang digunakan secara meluas dalam aplikasi peringkat perusahaan. Dalam persekitaran berbilang pengguna, memastikan ketekalan data dan kawalan konkurensi adalah fungsi penting sistem pangkalan data. Artikel ini akan berkongsi kawalan konkurensi berbilang versi dan data antara MySQL dan Oracle.

Analisis Pengalaman Projek Pemprosesan Transaksi Teragih dan Kawalan Konkurensi MySQL Dalam beberapa tahun kebelakangan ini, dengan perkembangan pesat Internet dan peningkatan bilangan pengguna, keperluan untuk pangkalan data juga telah meningkat. Dalam sistem teragih berskala besar, MySQL, sebagai salah satu sistem pengurusan pangkalan data hubungan yang paling biasa digunakan, sentiasa memainkan peranan penting. Walau bagaimanapun, apabila saiz data meningkat dan akses serentak meningkat, prestasi dan kebolehskalaan MySQL menghadapi cabaran yang teruk. Terutamanya dalam persekitaran yang diedarkan, cara mengendalikan urus niaga dan mengawal konkurensi telah menjadi keperluan mendesak untuk diselesaikan.
