MySQL支持多用戶同時(shí)讀寫,這是因?yàn)镸ySQL使用了并發(fā)控制機(jī)制來控制對(duì)數(shù)據(jù)庫(kù)的訪問。
在并發(fā)控制機(jī)制中,MySQL使用了鎖機(jī)制和事務(wù)機(jī)制。鎖機(jī)制針對(duì)的是數(shù)據(jù)庫(kù)中的行或者表,它可以把某些數(shù)據(jù)行或者表鎖定,保證在某一時(shí)間內(nèi)只有一個(gè)用戶對(duì)該數(shù)據(jù)進(jìn)行操作。事務(wù)機(jī)制則可以保證操作的原子性、一致性、隔離性和持久性。
下面是一個(gè)簡(jiǎn)單的代碼演示MySQL的并發(fā)控制機(jī)制:
-- 創(chuàng)建一個(gè)名為test的數(shù)據(jù)庫(kù) CREATE DATABASE test; -- 進(jìn)入test數(shù)據(jù)庫(kù) USE test; -- 創(chuàng)建一個(gè)名為user的表格 CREATE TABLE user (id INT NOT NULL AUTO_INCREMENT, name VARCHAR(20), age INT, PRIMARY KEY (id)); -- 向user表格插入數(shù)據(jù) INSERT INTO user (name, age) VALUES ('Tom', 18), ('Jack', 20), ('Lucy', 22); -- 在開始事務(wù)之前開啟事務(wù) START TRANSACTION; -- 查詢id為1的數(shù)據(jù),并鎖定該行 SELECT * FROM user WHERE id = 1 FOR UPDATE; -- 在該行中修改數(shù)據(jù) UPDATE user SET age = 19 WHERE id = 1; -- 提交事務(wù) COMMIT;
在上述代碼中,通過使用BEGIN來開啟一個(gè)事務(wù),然后使用SELECT ... FOR UPDATE來鎖定了id為1的數(shù)據(jù),并在該行中進(jìn)行修改操作,最后使用COMMIT來提交事務(wù)。在此過程中,如果有其他用戶也在同時(shí)操作這個(gè)數(shù)據(jù)行,MySQL會(huì)自動(dòng)加上鎖機(jī)制,并進(jìn)行阻塞等待,直到當(dāng)前用戶處理完該數(shù)據(jù)行為止。