## 事務的隔離級別
包括四種:Read uncommitted<Read committed<Repeatable read<Serializable
### Read uncommitted
讀未提交,一個事務可以讀取另一個未提交事務的數據,會產生臟讀
### Read committed
讀提交,就是一個事務要等另一個事務提交后才能讀取數據
若有事務對數據進行更新(update)操作時,讀操作事務要等待這個更新操作事務提交后才能讀取數據,可以解決臟讀問題。但會出現了一個事務范圍內兩個相同的查詢卻返回了不同數據,這就是不可重復讀
若有事務對數據進行插入(insert)操作,會出現幻讀
### Repeatable read
重復讀,就是在開始讀取數據(事務開啟)時,不再允許修改操作
重復讀可以解決不可重復讀問題
### Serializable
事務串行化順序執行,可以避免臟讀、不可重復讀與幻讀。隔離級別效率低下,比較耗數據庫性能,一般不使用。
### 數據庫修改事務隔離級別
```
#mysql
#可選參數有:READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE
#mysql默認是REPEATABLE-READ
transaction-isolation = REPEATABLE-READ
```
## MySQL 主從復制的原理
從庫生成兩個線程,一個I/O線程,一個SQL線程;
i/o線程去請求主庫 的binlog,并將得到的binlog日志寫到relay log(中繼日志) 文件中;
主庫會生成一個 log dump 線程,用來給從庫 i/o線程傳binlog;
SQL 線程,會讀取relay log文件中的日志,并解析成具體操作,來實現主從的操作一致,而最終數據一致;
## MySQL 主從同步延時問題
從庫同步主庫數據的過程是串行化的,也就是說主庫上并行的操作,在從庫上會串行執行。在高并發場景下,從庫的數據一定會比主庫慢一些,是有延時的。所以經常出現,剛寫入主庫的數據可能是讀不到的,要過幾十毫秒,甚至幾百毫秒才能讀取到。如果主庫突然宕機,然后恰好數據還沒同步到從庫,那么有些數據可能在從庫上是沒有的,有些數據可能就丟失了。
### semi-sync(半同步復制)
解決主庫數據丟失問題
主庫寫入 binlog 日志之后,就會將強制此時立即將數據同步到從庫,從庫將日志寫入自己本地的 relay log 之后,接著會返回一個 ack 給主庫,主庫接收到至少一個從庫的 ack 之后才會認為寫操作完成了
### 并行復制
解決主從同步延時問題
從庫開啟多個線程,并行讀取 relay log 中不同庫的日志,然后并行重放不同庫的日志,這是庫級別的并行
## 臟讀
如果一個事務中對數據進行了更新,但**事務還沒有提交**,另一個事務可以“看到”該事務沒有提交的更新結果,這樣造成的問題就是,如果第一個事務回滾,那么,第二個事務在此之前所“看到”的數據就是一筆臟數據
## 幻讀
幻讀是指同樣一筆查詢在整個事務過程中多次執行后,查詢所得的結果集是不一樣的。幻讀針對的是多筆記錄。在Read Uncommitted隔離級別下, 不管事務2的插入操作是否提交,事務1在插入操作之前和之后執行相同的查詢,取得的結果集是不同的
## 寫入數據時,聚簇索引所在的列的內容是隨機的,會引起什么性能問題
聚簇索引情況下,寫入數據時,插入速度嚴重依賴插入順序,按照主鍵的順序插入是加載數據到InnoDB表中速度最快的方式。但如果不是按照主鍵順序加載數據,那么在加載完成后最好使用OPTIMIZE TABLE命令重新組織一下表。?
基于聚簇索引的表在插入新行,或者主鍵被更新導致需要移動行的時候,可能面臨“頁分裂”的問題。當行的主鍵值要求必須將這一行插入到某個已滿的頁中時,存儲引擎會將該頁分裂成兩個頁面來容納該行,這就是一次分裂操作。頁分裂會導致表占用更多的磁盤空間。?
聚簇索引可能導致全表掃描變慢,尤其是行比較稀疏,或者由于頁分裂導致數據存儲不連續的時候
## COW機制
```
var_dump(memory_get_usage()); // int(660240)
$a = range(0,1000);
var_dump(memory_get_usage()); // int(697192)
$b = $a;
var_dump(memory_get_usage()); // int(697192)
$a = range(0,1000);
var_dump(memory_get_usage()); // int(734112)
```
**值相同共享內存的策略——寫時復制**
如果通過賦值的方式賦值給變量時不會申請新內存來存放新變量所保存的值,而是簡單的通過一個計數器來共用內存,只有在其中的一個引用指向變量的 值發生變化時才申請新空間來保存值內容以減少對內存的占用。 在很多場景下,PHP 都使用了 COW 進行內存的優化,比如:變量的多次賦值、函數參數傳遞,并在函數體內修改實參等
## post真的比get安全嗎?
1. get的參數信息會在access_log和瀏覽器中記錄到,有緩存,post不會
2. 若get有刪除操作,爬蟲可能會把你的數據刪掉
3. 實際上數據都是明文,應該換成https
## mysql中
- php
- 安全
- php7
- 特性
- 編譯安裝
- 源碼整體框架
- 基本變量
- thinkphp3.2.3
- thinkphp5.0
- thinkphp6.0
- laravel
- 配置
- 路由
- artisan控制臺
- eloquent
- tinker
- composer
- 加密解密
- 小知識點
- 數組
- string
- 代碼簡潔之道
- 編譯
- 語法糖
- lumen
- smarty
- 錯題集
- 算法及數據結構
- 線性表結構
- 插入排序
- 冒泡排序
- 數據庫
- mysql
- oracle
- PostgreSQL
- redis
- sqlserver
- 前端
- 備忘
- js
- nodejs
- vue
- css
- electron
- vue
- 語法糖
- colorui使用筆記
- 微信小程序
- 操作系統
- windows
- bat
- 快捷鍵
- linux
- sed
- 問題解決
- git
- docker
- docker-compose
- 正則表達式
- ps
- lua
- 協議相關
- 問題思索
- Golang
- 測試
- 讀取和寫入json配置文件
- 類
- 接口
- mod
- gin
- fyne
- 禪道二次開發
- 服務
- apache
- 漏洞配置
- http server優化
- nginx
- 安裝
- 面試題庫
- freeswitch