書上說:事物做爲一個不可分割的邏輯單元而被執行的一組sql語句,若是有必要,他們的執行效果能夠被撤銷。
個人理解:上面的這段話是《mysql技術內幕》對事物所下的定義。好高大上的樣子,彷佛不怎麼看得懂!我的的觀點是事物是一種機制,這種機制可以保證在一組的sql語句要麼都成功執行、要麼都不執行!mysql
答案是是否認的,和mysql的存儲引擎有關。目前只有innodb、fclcon存儲引擎支持,myisam 、memory存儲引擎都不支持事物sql
這種模式會在每一條語句執行完以後把它做出的修改馬上提交給數據庫,並使之永久化!事實上,這至關於把每一條語句當作一個事物來執行!數據庫
我的理解:因爲在自動提交模式下,每執行一條sql語句都會被當作一個事物自動提交或者回滾,這樣話,咱們就不能保證一組sql的語句成功的提交或者回滾了。怎麼辦呢?這就提提現出來了start transactioin的做用了。spa
start transaction的主要做用,就是掛起自動提交模式。所謂掛起自動提交模式,就是當咱們明確的使用了commit語句時纔將修改永久的寫入數據庫。
任何的語句(其中一些語句例外,如start transaction……,也就是隱式提交事物的那些語句除外)都將成爲該事物中的一部分,直到你發出一條commit語句或者rollback語句來提交或者撤銷它爲止!code
舉例說明:索引
此時尚未進行commit,開啓另一個窗口進行查詢:圖片
直到A窗口明顯是進行了commit以後,在B窗口才真正的出現了添加的 數據!it
所謂事物的隔離性就是指:一個事物什麼時候才能看到另一個事物所做出的修改。
因爲隔離級別的不一樣可能會出現各類各樣的問題,常見的問題以下:
髒讀:A事物在修改完一條數據,尚未進行提交,而B事物已經讀取到了該條數據
幻讀:A事物插入一條數據,尚未commit,而B事物已經獨到了新增的這條數據io
綜上所述,究其緣由是由於,B事物讀到了其餘事物尚未提交的數據。爲了解決上述的一些問題,mysql的innodb引擎提供了4個事物的隔離級別?、innodb
READ UNCOMMITED 容許某個事物看到其它事物還沒有提交的數據改動!
READ COMMITED 只容許事物看到其餘事物已經提交過的數據改動!
REAPEATABLE READ 顧名思義是可重複讀的意思,若是事物執行了統一條select語句,其結果是相同的,即便有其餘事物在同時插入或者修改該數據行看到的結果也是同樣的!這個是mysql的默認隔離級別!這裏咱們重點說一下!
舉例說明:
a、同事打開A和B兩個窗口,查看事物的隔離級別,兩個事物的隔離級別都是可重複讀!
b、BankAccount表中的建表語句和初始數據以下:
c、A、B窗口中同時掛起自動提交!
d、在A、B窗口分別執行以下操做!
經過上面的實驗咱們能夠知道,即便是A窗口已經commit了,那麼B窗口讀到的仍然是start transaction以前的數據,並無讀到commit以後那兩條新增長的數據
SERIALIZABLE,這個隔離級別同REAPEATABLE READ很是的類似,可是對事物的隔離更加的完全,某個事物證在讀去的數據時不容許其餘事物進行修改的,知道該事物完成時候!(我的認爲和加上了寫鎖的效果相似)
上面的咱們有所過有些語句是不能放在事物中的,它會隱式的提交當前事物,好比以前提到的事物的嵌套,start transaction 中又進行了start transaction
通常來講下面幾個方面的語句是會隱式的提交當前事物的:
DDL(Data Defined Language)語句:好專業的樣子,其實就是數據的定義語句,常見的有:
create databases(建立數據庫)
drop databases(刪除數據庫)
create table (建立表)
drop table(刪除表)
alter table (修改表結構)
rename table (爲表重命名)
truncate table(清空表)
create index(建立索引)
drop index(刪除索引)
此外關於鎖定和解鎖的相關操做也會提交當前事物:
lock tables(鎖定表)
unlock tables(解鎖表)
《mysql技術內幕》
以上的觀點,若有紕漏清高手不吝賜教!