locking、concurrency、isolation、serializability這幾個是同一個意思mysql
第一準則:不出錯
Concurrent execution should not cause application programs to malfunctionsql
第二準則:性能要比單線程高
Concurrent execution should not have lower throughput or much higher response times than serial execution數據庫
特例:線程池,秒殺場景,1024個線程確定比1個線程慢,單線程qps能達到將近1000,1024線程只能幾十多線程
數據庫中並行執行會存在三個問題併發
髒讀 rc解決 不可重複讀 rr解決,innodb在rr下也解決了幻讀,因此rr被稱爲2.99度隔離性 幻讀 serializable 大多數數據庫廠商不遵循
serializable纔是數據庫真正的隔離性要求,隔離性和隔離級別不同,兩階段加鎖(讀寫都加鎖,序列化),任何操做都加鎖oracle
acid中的i,數據庫產品都沒有符合要求的app
oracle db2 sqlserver默認事務隔離級別都是rc的,只解決髒讀不解決不可重複讀和幻讀分佈式
innodb默認rr,解決了髒讀,不可重複讀,幻讀sqlserver
tips:
若是開啓了分佈式事務,必定要用serializable,這是官方文檔裏說的,不知道爲何,不懂性能
幻讀(phantom read):連續執行兩次一樣的sql語句可能致使不一樣的結果,而且第二次的sql語句可能會返回以前不存在的行(記錄數量不同)
不可重複讀是同一條記錄結果不同(修改),而幻讀是讀到的記錄數量不同
rc不解決幻讀,但rc相對rr,鎖持有時間短 ,開銷更小
可是
咱們應用程序對生活中的application來講好像不是一個問題
對記錄的修改,大部分時候都是一條一條的,本身處理本身。
有問題的是減庫存的的時候,多線程對一條記錄操做,但這個時候是有for update鎖定這條記錄,因此現實生活中,不可重複讀和幻讀沒影響,並非那麼重要
innodb表鎖的獲取
lock table l read; lock table l write; unlock tables;
這是server層的鎖(mdl鎖)
從原理上講innodb也是能夠對錶加X鎖的,可是沒有一個具體的命令來觸發,也能夠把lock table l read; 理解爲加X鎖
一般來講不須要加表級別的鎖,mysqldump都不加,ddl不支持online的時候就是先對一張表先加一個S鎖,如今不同了