mysql知識點

sql注入問題

sql語句應該考慮哪些安全性問題
  1. 防止sql注入,對特殊字符進行過濾、轉義或者使用預編譯的sql語句綁定變量程序員

  2. 當sql語句運行報錯時,不要把數據庫返回的錯誤信息所有顯示給用戶,以防止泄露服務器和數據庫相關信息sql

sql注入

若是sql語句在拼接的狀況下,使得查詢永遠成立,如拼接上 or '1'='1',會發生不安全問題數據庫

解決辦法:安全

  1. 參數綁定:不拼接字符串,使用preparedStatement,參數使用set方法進行填裝服務器

  2. 檢查變量的數據類型:如sql語句相似where id={$id},數據庫中全部的id都是數字,那麼在執行sql語句前,要保證ID是int類型網絡

  3. 全部的sql語句都封裝在存儲過程當中併發

存儲過程

一些編譯好的sql語句,這些sql語句代碼向一個方法同樣實現一些功能,而後再給這些代碼塊取一個名字,在用到這個功能的時候調用它便可。模塊化

優勢spa

  1. 存儲過程由於SQL 語句已經預編譯過了,所以運行的速度比較快。設計

  2. 存儲過程在服務器端運行,減小客戶端的壓力。

  3. 容許模塊化程序設計,就是說只須要建立一次過程,之後在程序中就能夠調用該過程任意次,相似方法的複用。

  4. 減小網絡流量,客戶端調用存儲過程只須要傳存儲過程名和相關參數便可,與傳輸SQL 語句相比天然數據量少了不少。

  5. 加強了使用的安全性,充分利用系統管理員能夠對執行的某一個存儲過程進行權限限制,從而可以實現對某些數據訪問的限制,避免非受權用戶對數據的訪問,保證數據的安全。程序員直接調用存儲過程,根本不知道表結構是什麼,有什麼字段,沒有直接暴露表名以及字段名給程序員。

數據庫錶鏈接方式

內鏈接,外鏈接(左外鏈接(是內鏈接的下一階段)、有外鏈接、全外鏈接)

事務

事務是由一組sql語句組成的邏輯處理單元。用戶定義的一個數據庫操做序列,是數據恢復和併發控制的基本單位。

事務的特性
  1. 原子性:一個事務中的全部操做,要麼所有完成,要麼所有不完成,不會結束在中間某個環節。事務在執行過程當中發生錯誤,會被回滾到事務開始前的狀態。

  2. 一致性:在事務開始和完成時,數據庫中的數據都保持一致的狀態,數據的完整性約束沒有被破壞。(事務的執行使得數據庫從一種正確狀態轉換成另外一種正確狀態)

  3. 隔離性:一個事務的執行不能被其餘事務干擾。爲了防止事務操做間的混淆,必須串行化或序列化請求,使得在同一時間僅有一個請求用於同一數據。隔離性經過鎖就能夠實現。

  4. 持久性:一個事務一旦提交,它對數據庫中數據的改變就應該是永久性的,並不會被回滾。

併發事務帶來的問題:
  1. 更新丟失:兩個事務Tl 和T2 對同一數據讀寫,T2 提交的結果覆蓋了Tl 提交的結果,致使Tl 的修改被丟失。

  2. 髒讀:事務1讀取到事務2未提交的數據

  3. 不可重複讀:是指在一個事務內,屢次讀同一數據。在這個事務尚未結束時,另一個事務也訪問該同一數據。那麼,在第一個事務中的兩次讀數據之間,因爲第二個事務的修改,那麼第一個事務兩次讀到的的數據多是不同的----------------------修改

  4. 虛讀、幻讀:屢次讀出來的記錄數不同------------增長/刪除

併發控制的方式

加鎖

數據庫事務的隔離級別:
  1. read uncommited:容許事務讀取未被其餘事務提交的變動

  2. read commited:容許事務讀取已經被其餘事務提交的變動,能夠避免髒讀,可能有不可重複讀和幻讀的問題。

  3. repeatable read:確保事務能夠屢次從一個字段中讀取相同的值,在這個事務持續期間,禁止其餘事務對這個字段進行更新,能夠避免髒讀和不可重複讀,可能會有幻讀。

  4. 可串行化

數據庫保證數據的一致性的方法:事務、悲觀鎖、樂觀鎖

鎖是一種併發控制技術,鎖用來在多用戶同時訪問同一個數據的時候保護數據的

鎖類型
  1. 共享(S)鎖多個事務可封鎖一個共享頁,任何事務都不能修改該頁.一般是該頁被讀取完畢,S 鎖當即被釋放。在執行select 語句的時候須要給操做對象加上共享鎖,但加鎖以前須要檢查是否有排他鎖,若是沒有,則能夠加共享鎖(一個對象上能夠加n 個共享鎖),不然不能加。共享鎖一般在執行完select 語句以後被釋放,也有多是在事務結束(包括正常結束和異常結束)的時候被釋放,主要取決與數據庫所設置的事務隔離級別。

  2. 排它(X)鎖:僅容許一個事務封鎖此頁;其餘任何事務必須等到X 鎖被釋放才能對該頁進行訪問;X 鎖一直到事務結束才能被釋放。執行insert、update、delete 語句的時候須要給操做的對象加排他鎖,在加排他鎖以前必須確認該對象上沒有其餘任何鎖,一旦加上排他鎖以後,就不能再給這個對象加其餘任何鎖。排他鎖的釋放一般是在事務結束的時候,可是數據庫事務隔離級別被設置成Read Uncommitted的時候,這種狀況下排他鎖會在執行完更新操做以後就釋放

產生死鎖的必要條件(缺一都不會發生死鎖)
  1. 互斥條件:一個資源每次只能被一個進程使用。

  2. 請求與保持條件:一個進程因請求資源而阻塞時,對已得到的資源保持不放。

  3. 不可剝奪條件:進程已得到的資源,在末使用完以前,不能強行剝奪。

  4. 環路等待條件:若干進程之間造成一種頭尾相接的循環等待資源關係。

相關文章
相關標籤/搜索