這個問題比較常見,能夠分爲如下幾種狀況
1.數據量小的狀況能夠直接使用limit M,N
2.數據量中等的狀況可使用數學中的正態曲線來解決此問題,不過前提要計算出where中的總數量
3.數據量大且有上一頁寫一頁的操做,能夠在每一頁的數據下發一個自增ID,以即可以在下一頁的時候where id>xx limit N;上一頁的時候where id<xx limit M desc;此問題有個問題就是數據在翻頁過程當中可能有書籍漏掉的狀況
4.數據量大且有直達頁的狀況,就須要先計算本頁全部的ID(此時用到覆蓋索引),而後經過自增ID去獲取相關數據sql
隔離級別 | 髒讀 | 不可重複讀 | 幻讀 |
---|---|---|---|
未提交讀 | 可能 | 可能 | 可能 |
已提交讀 | 不可能 | 可能 | 可能 |
可重複讀 | 不可能 | 不可能 | 可能 |
可串行化 | 不可能 | 不可能 | 不可能 |
1.未提交讀(Read Uncommitted):容許髒讀,也就是可能讀取到其餘會話中未提交事務修改的數據
2.提交讀(Read Committed):只能讀取到已經提交的數據。Oracle等多數數據庫默認都是該級別 (不重複讀)
3.可重複讀(Repeated Read):可重複讀。在同一個事務內的查詢都是事務開始時刻一致的,InnoDB默認級別。在SQL標準中,該隔離級別消除了不可重複讀,可是還存在幻象讀
4.串行讀(Serializable):徹底串行化的讀,每次讀都須要得到表級共享鎖,讀寫相互都會阻塞數據庫1.髒讀 :一個事務讀取到另外一事務未提交的更新數據
2.不可重複讀 : 在同一事務中,屢次讀取同一數據返回的結果有所不一樣, 換句話說, 後續讀取能夠讀到另外一事務已提交的更新數據.
3.可重複讀 : 在同一事務中屢次讀取數據時, 可以保證所讀數據同樣, 也就是後續讀取不能讀到另外一事務已提交的更新數據。
4.幻讀 :一個事務讀到另外一個事務已提交的insert數據優化