JDBC與MySql:事務

什麼是事務?

 事務的概念:

事務是指邏輯上的一組操作,這組操作要麼同時完成要麼同時不完成.

案例:
有一個很經典的銀行轉賬案例,解釋了什麼是事務,事務的重要性:
假設有a,b兩個人分別有1000元,a向b轉賬200元,那麼對應地在數據庫的操作就是把a的餘額值減200,給b的餘額值加200。這兩個操作分別是由兩條sql語句完成的,那麼假設在執行第一條sql語句之後數據庫發生故障,第二條語句未能執行,等到數據庫恢復之後a的賬戶被減去200變成了800,而因爲在執行第二條語句的時候數據庫發生故障所以第二條語句沒有自信,b的餘額沒有改變依然是1000.顯示中銀行發生這種事故無疑是致命的,但是我們使用銀行轉賬功能的時候爲何沒有遇到這種情況呢?這是因爲使用了事務機制。把轉賬的兩條sql語句看做一組操作,如果這組操作中的任何一步操作失敗或沒有操作,那麼就不對數據庫進行修改。

事物的四大特性:

一個事務具有的最基本的特性,一個設計良好的數據庫可以幫我們保證事務具有這四大特性(ACID)

        原子性:原子性是指事務是一個不可分割的工作單位,事務中的操作要麼都發生,要麼都不發生。 
        一致性:如果事務執行之前數據庫是一個完整性的狀態,那麼事務結束後,無論事務是否執行成功,數據庫仍然是一個完整性狀態.
            數據庫的完整性狀態:當一個數據庫中的所有的數據都符合數據庫中所定義的所有的約束,此時可以稱數據庫是一個完整性狀態.
        隔離性:事務的隔離性是指多個用戶併發訪問數據庫時,一個用戶的事務不能被其它用戶的事務所幹擾,多個併發事務之間數據要相互隔離。
        持久性:持久性是指一個事務一旦被提交,它對數據庫中數據的改變就是永久性的,接下來即使數據庫發生故障也不應該對其有任何影響。

    其中,隔離性:
        將數據庫設計成單線程的數據庫,可以防止所有的線程安全問題,自然就保證了隔離性.但是如果數據庫設計成這樣,那麼效率就會極其低下.

在MySql中使用事務:

在MySql中是MySql數據庫自動管理事務的,自動把每條sql語句都當成獨立一個事務。
但是這種自動管理事務的方法顯然沒什麼卵用~~~
最終還是要我們開發人員按照實際情況去使用事務,下面將說說如何使用事務:

在MySql中輸入start transaction之後所輸入的sql語句都視爲同一組操作在同一個事務內。
如果在start transaction之後所修改的數據庫最終沒執行commit命令,則之前所做的修改將會全部無效。
如果在start transaction之後需要回滾則使用 rollback,但是需要注意的是在start transaction後,使用了commit,那麼rollback操作將無效。
下面就以銀行轉賬操作來做例子示範一下如何使用事務:
start transaction;
update account set balance=balance-200 where name='a';
update account set balance=balance+200 where name='b';
commit;

在JDBC中使用事務:

在jdbc中使用事務是依靠connection對象來操作的,上文說了,MySql的事務是MySql自動管理的,所以在jdbc中我們首先要把自動管理關閉,

先關閉自動管理事務
 conn.setAutoCommit(false);
//再使用Statement的對象執行作爲同一組操作的sql語句,這裏不再寫出來,如果不知道jdbc的基礎使用可以參考筆者的博客
conn.cmooit();//最後提交事務




               







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