請口述以下問題:
- 什麼是事務到特性,具體說說你到理解
- 請舉一個案例描述爲什麼要用到事務(轉賬)
- 事務的隔離級別
- 待續。。。
1、事務到特性(ACID)
- Atomicty 原子性
事務不可再分。
現實中的一個需求,由多條SQL實現時,現實中的一件事只有兩種結果,要麼成功要麼失敗。事務機制就實現了將多條sql“當成”一條sql來執行,通過這種機制加上人爲的判斷,實現多條sql要麼都成功,要第都失敗。 - Consistence 一致性
事務的執行過程中,對數據表的影響是沒有的。 - Isolation 隔離性
當一個事件的執行,不會影響其他客戶端的數據表中查詢到的結果。 - Duration 永久性
當一個事務執行交,其影響就是永久的。
A->B(A給B轉賬100)
正常mysql流程:
A賬戶 | B賬戶 |
---|---|
A-100 | B+100 |
可能情況:
情況 | A賬戶 | B賬戶 |
---|---|---|
第一種 | A-100 | B+100 |
第二種 | A-100 | B |
第三種 | A | B+100 |
第四種 | A | B |
2、隔離性與隔離級別
當數據庫上有多個事務同時執行的時候,就可能出現髒讀(dirty read)、不可重複讀(non-repeatable read)、幻讀(phantom read)的問題,爲了解決這些問題,就有了“隔離級別”的概念。
SQL標準的事務隔離級別包括:讀未提交(read uncommitted)、讀提交(read committed)、可重複讀(repeatable read)和串行化(serializable )
- 讀未提交是指,一個事務還沒提交時,它做的變更就能被別的事務看到。
事務沒提交,做等變更別等事務能看到
- 讀提交是指,一個事務提交之後,它做的變更纔會被其他事務看到。
事務提交了,它做的變更別的事務才能看到
- 可重複讀是指,一個事務執行過程中看到的數據,總是跟這個事務在啓動時看到的數據是一致的。當然在可重複讀隔離級別下,未提交變更對其他事務也是不可見的。
- 串行化,顧名思義是對於同一行記錄,“寫”會加“寫鎖”,“讀”會加“讀鎖”。當出現讀寫鎖衝突的時候,後訪問的事務必須等前一個事務執行完成,才能繼續執行。
讀也加鎖啊寫也加鎖,讀寫鎖衝突,後面的事務等前面事務執行完成再執行,一串
隔離得越嚴實,效率就會越低。需要找一個平衡點。