數(shù)據(jù)庫事務(wù)
- 一組邏輯操作單元,使數(shù)據(jù)從一種狀態(tài)變換到另一種狀態(tài)
- 事務(wù)的操作:先定義開始一個事務(wù),然后對數(shù)據(jù)作修改操作,這時如果提交(COMMIT),這些修改就永久地保存下來,如果回退(ROLLBACK),數(shù)據(jù)庫管理系統(tǒng)將放棄所作的所有修改而回到開始事務(wù)時的狀態(tài)
事務(wù)的ACID(acid)屬性
- 原子性(Atomicity)?原子性是指事務(wù)是一個不可分割的工作單位,事務(wù)中的操作要么都發(fā)生,要么都不發(fā)生。
- 一致性(Consistency)?事務(wù)必須使數(shù)據(jù)庫從一個一致性狀態(tài)變換到另外一個一致性狀態(tài)。
- 隔離性(Isolation)?事務(wù)的隔離性是指一個事務(wù)的執(zhí)行不能被其他事務(wù)干擾,即一個事務(wù)內(nèi)部的操作及使用的數(shù)據(jù)對并發(fā)的其他事務(wù)是隔離的,并發(fā)執(zhí)行的各個事務(wù)之間不能互相干擾。
- 持久性(Durability)?持久性是指一個事務(wù)一旦被提交,它對數(shù)據(jù)庫中數(shù)據(jù)的改變就是永久性的,接下來的其他操作和數(shù)據(jù)庫故障不應(yīng)該對其有任何影響
1.如果多個操作使用不用數(shù)據(jù)庫連接,則無法保證事務(wù)
2.步驟
- 設(shè)置自動提交為false: conn.setAutoCommit(false);
- 如果事務(wù)都成功提交事務(wù): conn.commit();
- 如果事務(wù)出現(xiàn)異?;貪L事務(wù) : conn.rollback();
事務(wù)隔離
1.常見并發(fā)問題
- 臟讀: 對于兩個事物 T1, T2, T1 讀取了已經(jīng)被 T2 更新但還沒有被提交的字段. 之后, 若 T2 回滾, T1讀取的內(nèi)容就是臨時且無效的.
- 不可重復(fù)讀: 對于兩個事物 T1, T2, T1 讀取了一個字段, 然后 T2 更新了該字段. 之后, T1再次讀取同一個字段, 值就不同了.
- 幻讀: 對于兩個事物 T1, T2, T1 從一個表中讀取了一個字段, 然后 T2 在該表中插入了一些新的行. 之后, 如果 T1 再次讀取同一個表, 就會多出幾行.
2隔離級別

- Oracle 支持的 2 種事務(wù)隔離級別:READ COMMITED, SERIALIZABLE. Oracle 默認的事務(wù)隔離級別為: READ COMMITED
- Mysql 支持 4 中事務(wù)隔離級別. Mysql 默認的事務(wù)隔離級別為: REPEATABLE READ
3.設(shè)置數(shù)據(jù)庫隔離級別
- 運行時設(shè)置
conn.setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED); - mysql設(shè)置
查看當前的隔離級別: SELECT @@tx_isolation;
設(shè)置當前 mySQL 連接的隔離級別:
set transaction isolation level read committed;
設(shè)置數(shù)據(jù)庫系統(tǒng)的全局的隔離級別:
set global transaction isolation level read committed;
使用批量處理
- addBatch(String)/addBatch():添加需要批量處理的SQL語句或是參數(shù);
- executeBatch();執(zhí)行批量處理語句;
- clearBatch();將上次執(zhí)行清空