JDBC 事務(wù)操作

數(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í)行清空
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容