1、事務概述
1.什麼是事務
一件事情有n個組成單元 要不這n個組成單元同時成功 要不n個單元就同時失敗
就是將n個組成單元放到一個事務中
2.mysql的事務
默認的事務:一條sql語句就是一個事務 默認就開啓事務並提交事務
手動事務:
1)顯示的開啓一個事務:start transaction
2)事務提交:commit表明從開啓事務到事務提交 中間的全部的sql都認爲有效 真正的更新數據庫
3)事務的回滾:rollback 表明事務的回滾 從開啓事務到事務回滾 中間的全部的 sql操做都認爲無效數據庫沒有被更新mysql
2、JDBC事務操做
默認是自動事務:
執行sql語句:executeUpdate() ---- 每執行一次executeUpdate方法 表明 事務自動提交
經過jdbc的API手動事務:
開啓事務:conn.setAutoComnmit(false);
提交事務:conn.commit();
回滾事務:conn.rollback();
注意:控制事務的connnection必須是同一個
執行sql的connection與開啓事務的connnection必須是同一個才能對事務進行控制面試
3、DBUtils事務操做
1.QueryRunner
有參構造:QueryRunner runner = new QueryRunner(DataSource dataSource);
有參構造將數據源(鏈接池)做爲參數傳入QueryRunner,QueryRunner會從連 接池中得到一個數據庫鏈接資源操做數據庫,因此直接使用無Connection參數 的update方法便可操做數據庫sql
無參構造:QueryRunner runner = new QueryRunner();
無參的構造沒有將數據源(鏈接池)做爲參數傳入QueryRunner,那麼咱們在使 用QueryRunner對象操做數據庫時要使用有Connection參數的方法數據庫
4、使用ThreadLocal綁定鏈接資源安全
5、事務的特性和隔離級別(概念性問題---面試)
1.事務的特性ACID
1)原子性(Atomicity)原子性是指事務是一個不可分割的工做單位,事務中的操做 要麼都發生,要麼都不發生。
2)一致性(Consistency)一個事務中,事務先後數據的完整性必須保持一致。
3)隔離性(Isolation)多個事務,事務的隔離性是指多個用戶併發訪問數據庫時, 一個用戶的 事務不能被其它用戶的事務所幹擾,多個併發事務之間數據要相互隔離。
4)持久性(Durability)持久性是指一個事務一旦被提交,它對數據庫中數據的改變 就是永久性的,接下來即便數據庫發生故障也不該該對其有任何影響。session
2.併發訪問問題----由隔離性引發
若是不考慮隔離性,事務存在3中併發訪問問題。
1)髒讀:B事務讀取到了A事務還沒有提交的數據 ------ 要求B事務要讀取A事 務提交的數據
2)不可重複讀:一個事務中 兩次讀取的數據的內容不一致 ----- 要求的是一個事 務中屢次讀取時數據是一致的 --- unpdate
3)幻讀/虛讀:一個事務中 兩次讀取的數據的數量不一致 ----- 要求在一個事務多 次讀取的數據的數量是一致的 --insert delete
3.事務的隔離級別
1)read uncommitted : 讀取還沒有提交的數據 :哪一個問題都不能解決
2)read committed:讀取已經提交的數據 :能夠解決髒讀 ---- oracle默認的
3)repeatable read:重讀讀取:能夠解決髒讀 和 不可重複讀 ---mysql默認的
4)serializable:串行化:能夠解決 髒讀 不可重複讀 和 虛讀---至關於鎖表併發
注意:mysql數據庫默認的隔離級別
查看mysql數據庫默認的隔離級別:select @@tx_isolation
設置mysql的隔離級別:set session transaction isolation level 設置事務隔離級別oracle
總結:性能
mysql的事務控制: 開啓事務:start transaction; 提交:commit; 回滾:rollback; JDBC事務控制: 開啓事務:conn.setAutoCommit(false); 提交:conn.commit(); 回滾:conn.rollback(); DBUtils的事務控制 也是經過jdbc ThreadLocal:實現的是經過線程綁定的方式傳遞參數 概念: 事務的特性ACID 併發問題:髒讀、不可重讀、虛讀\幻讀 解決併發:設置隔離級別 read uncommitted read committed repeatable read (mysql默認) serialazable 隔離級別的性能: read uncommitted>read committed>repeatable read>serialazable 安全性: read uncommitted<read committed<repeatable read<serialazable