Mybatis的連接池和事務

Mybatis中的連接池

配置位置

主配置文件中的dataSource 標籤的type屬性指定採用何種連接池方式。

<dataSource type="POOLED"></dataSource >
type屬性的取值
  1. POOLED:採用傳統的javax.sql.DataSource規範中的連接池,mybatis中有針對規範的實現。
  2. UNPOOLED:採用傳統的獲取連接的方式,雖然也實現Javax.sql.DataSource接口,但是並沒有使用池的思想。
  3. JNDI:採用服務器提供的JNDI技術實現,來獲取DataSource對象,不同的服務器所能拿到DataSource是不一樣。
  • 如果不是web或者maven的war工程,不能使用JNDI。

事務

什麼是事務?

數據庫事務(簡稱:事務)是數據庫管理系統執行過程中的一個邏輯單位,由一個有限的數據庫操作序列構成。

事務的四大特性ACID
  • 原子性(Atomicity):事務作爲一個整體被執行,包含在其中的對數據庫的操作要麼全部被執行,要麼都不執行。
  • 一致性(Consistency):事務應確保數據庫的狀態從一個一致狀態轉變爲另一個一致狀態。一致狀態的含義是數據庫中的數據應滿足完整性約束。
  • 隔離性(Isolation):多個事務併發執行時,一個事務的執行不應影響其他事務的執行。
  • 持久性(Durability):已被提交的事務對數據庫的修改應該永久保存在數據庫中。
不考慮隔離性產生的3個問題
  • 髒讀:一個事務讀取到了另一個事務未提交的數據操作結果。這是相當危險的,因爲很可能所有的操作都被回滾。
  • 不可重複讀:不可重複讀(Non-repeatable Reads):一個事務對同一行數據重複讀取兩次,但是卻得到了不同的結果。包括以下情況:
    (1) 虛讀:事務T1讀取某一數據後,事務T2對其做了修改,當事務T1再次讀該數據時得到與前一次不同的值。
    (2) 幻讀(Phantom Reads):事務在操作過程中進行兩次查詢,第二次查詢的結果包含了第一次查詢中未出現的數據或者缺少了第一次查詢中出現的數據(這裏並不要求兩次查詢的SQL語句相同)。這是因爲在兩次查詢過程中有另外一個事務插入數據造成的。
四種隔離級別
  • 未授權讀取:也稱爲讀未提交(Read Uncommitted):允許髒讀取,但不允許更新丟失。如果一個事務已經開始寫數據,則另外一個事務則不允許同時進行寫操作,但允許其他事務讀此行數據。
  • 授權讀取:也稱爲讀提交(Read Committed):允許不可重複讀取,但不允許髒讀取。這可以通過“瞬間共享讀鎖”和“排他寫鎖”實現。讀取數據的事務允許其他事務繼續訪問該行數據,但是未提交的寫事務將會禁止其他事務訪問該行。
  • 可重複讀取(Repeatable Read):禁止不可重複讀取和髒讀取,但是有時可能出現幻讀數據。這可以通過“共享讀鎖”和“排他寫鎖”實現。讀取數據的事務將會禁止寫事務(但允許讀事務),寫事務則禁止任何其他事務。
  • 序列化(Serializable):提供嚴格的事務隔離。它要求事務序列化執行,事務只能一個接着一個地執行,不能併發執行。僅僅通過“行級鎖”是無法實現事務序列化的,必須通過其他機制保證新插入的數據不會被剛執行查詢操作的事務訪問到。

Mybatis中的事務

通過sqlsession對象的commit方法和rollback方法實現事務的提交和回滾。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章