天天看點

mysql基礎(六)mysql事務

<code>mysql事務:是一個獨立的工作單元</code>

<code>事務必須通過ACID測試:</code>

<code>    </code><code>原子性(Atomicity):一個事務的所有操作要麼全部成功執行,要麼全部失敗後復原</code>

<code>    </code><code>一緻性(Consistency):資料庫總是從一個一緻性狀态轉換成另一個狀态</code>

<code>    </code><code>隔離性(Isolation):一個事務在做出的操作在送出之前,其他事務是不可見的,隔離有多種級别</code>

<code>    </code><code>持久性(Durability):一旦事務送出,其所做出的操作将永久儲存在資料庫中</code>

<code>事務的執行流程:</code>

<code>    </code><code>啟動事務</code><code>-</code><code>-</code><code>&gt;執行SQL語句</code><code>-</code><code>-</code><code>&gt;送出事務</code><code>-</code><code>-</code><code>&gt;儲存資料</code>

<code>    </code><code>啟動事務</code><code>-</code><code>-</code><code>&gt;執行SQL語句</code><code>-</code><code>-</code><code>&gt;復原</code><code>-</code><code>-</code><code>&gt;資料不發生任何改變</code>

<code>    </code> 

<code>事務的隔離級别:</code>

<code>    </code><code>Read Uncommitted(讀取未送出内容)</code>

<code>    </code><code>出現問題:</code><code>1</code><code>、</code><code>2</code><code>、</code><code>3</code>      <code>#不建議使用此隔離級别</code>

<code>    </code><code>Read Committed(讀送出)</code>

<code>    </code><code>出現問題:</code><code>2</code><code>、</code><code>3</code>            <code>#大多數資料庫使用的隔離級别,性能較好</code>

<code>    </code><code>Repeatable Read(不可重複讀)</code>

<code>        </code><code>出現問題:</code><code>3</code>          <code>#mysql預設使用的隔離級别</code>

<code>    </code><code>Serializable(串行化)        </code><code>#資料安全性最好,并發通路能力最弱,可能會出現死鎖,</code>

<code>        </code><code>出現問題:</code><code>4</code>      <code>除非在資料要求比較嚴格的情況下,否則不建議使用</code>

<code>         </code> 

<code>出現問題:</code>

<code>    </code><code>1</code><code>、髒讀:可以讀取其他事務沒有送出的資料</code>

<code>    </code><code>2</code><code>、不可重複讀:在目前事務中沒有做出任何修改,但使用select檢視資料時可能檢視到不同的數</code>

<code>    </code><code>3</code><code>、幻讀:在目前事務送出之前隻能看見啟動事務時的資料和在目前事務中做出修改的資料,</code>

<code>             </code><code>而其他事務所做出的修改将不能看見</code>

<code>    </code><code>4</code><code>、加鎖讀:如果在此事務中對表進行修改,那麼資料庫将給做出修改的表加上表鎖,</code>

<code>               </code><code>在此事務送出之前其他事務對此表做出的操作都會阻塞</code>

<code>mysql&gt; SHOW VARIABLES LIKE </code><code>'%iso%'</code><code>;      </code><code>#檢視目前的隔離級别</code>

<code>    </code><code>SET</code> <code>tx_isolation</code><code>=</code><code>'參數'</code>          <code>#修改隔離級别</code>

<code>       </code><code>對應參數(不區分大小寫):</code>

<code>        </code><code>Read</code><code>-</code><code>Uncommitted        </code><code>#1</code>

<code>        </code><code>Read</code><code>-</code><code>Committed          </code><code>#2</code>

<code>        </code><code>Repeatable</code><code>-</code><code>Read         </code><code>#3(預設)</code>

<code>        </code><code>Serializable            </code><code>#4  </code>

<code>    </code><code>mysql&gt; </code><code>SET</code> <code>GLOBAL autocommit</code><code>=</code><code>0</code><code>;       </code><code>#關閉自動送出事務</code>

<code>    </code><code>mysql&gt; START TRANSACTION       </code><code>#啟動事務</code>

<code>    </code><code>mysql&gt; COMMIT           </code><code>#送出事務</code>

<code>    </code><code>mysql&gt; ROLLBACK         </code><code>#復原    </code>

<code>mysql事務日志:</code>

<code>    </code><code>同僚務日志和崩潰後安全恢複可以很好的儲存資料安全</code>

<code>    </code><code>事務日志包括:重做日志redo和復原日志undo,事務日志通常比較小</code>

<code>   </code> 

<code>    </code><code>Redo記錄的是已經全部完成的事務,就是執行了COMMIT的事務</code>

<code>    </code><code>記錄日志組是ib_logfile0、ib_logfile1   記錄日志組可以更加需要調整檔案數量</code>

<code>    </code><code>Undo記錄的是已部分完成并且寫入硬碟的未完成的事務</code>

<code>    </code><code>在mysq重新開機後,innodb通過事務日志将所有已完成并寫入磁盤的和未完成的事務進行同步</code>

<code>    </code><code>并将資料寫入到磁盤中完成資料庫崩潰後安全恢複</code>

<code>    </code><code>mysql&gt; SHOW VARIABLES LIKE </code><code>'innodb_log%'</code><code>;        </code><code>#檢視事務日志的相關配置</code>

<code>        </code><code>innodb_log_file_size            </code><code>#設定事務日志大小</code>

<code>    </code><code>innodb_log_files_in_group      </code><code>#設定事務日志組檔案數量</code>

<code>    </code><code>innodb_log_group_home_dir         </code><code>#設定事務日志存放位置</code>

<code></code>

本文轉自  紅塵世間  51CTO部落格,原文連結:http://blog.51cto.com/hongchen99/1932978