標籤:mysq 自動 插入 錯誤 com save 索引 color values
MySQL的事務
1.事務:事務是由一步或者幾步資料庫操作序列組成的邏輯執行單元,這一系列操作要麼全部執行,要麼全部放棄執行。
2.事務具備的四個特性(簡稱為ACID性):
(1)原子性(Atomicity):
事務是應用中最小的執行單位,具有不可再分的特徵,事務是應用中最小的邏輯執行體;
(2)一致性(Consistency):
事務執行的結果必須使資料庫從一個一致性狀態轉變到另一個一致性的狀態。當資料庫只包含事務成功提交的結果時,資料庫處於一致性狀態。如果系統運行發生中斷,某個事務尚未完成而被迫中斷,而該未完成的事務對資料庫所做的修改已被寫入資料庫,此時的資料處於一種不正確的狀態,這種不正確的狀態就是處於不一致性狀態。一致性是通過原子性來保證的。
(3)隔離性(Isolation):
各個事務的執行互不干擾,任意一個事務的內部操作對於其他並發的事務都是隔離的。並發執行的事務之間影響不到對方的中間狀態。
(4)持久性(Durability):
也成為持久性,指事務一但提交,對資料所做的任何改變都將記錄的永久的儲存空間中,即物理資料庫中。
3.事務組成:
(1)一組DML語句:操作資料庫表中記錄的語言;
(2)一條DDL語句:操作資料庫對象的語言;
注釋:資料庫物件指的是表(table)、資料字典、約束(constraint)、視圖(view)、索引(index)、函數(function)、預存程序(procedure)、觸發器(trigger)等;其中資料字典其實就是一張特殊的表,儲存的是資料庫相關資訊,通常不被操作。
(3)一條DCL語句:資料控制語句。
其中DDL語句和DCL語句只能有一條,DDL語句可DCL語句會導致事務立即提交。
4.提交事務的方式:
(1)顯式提交:使用commit關鍵字;
(2)自動認可:執行DDL或者DCL語句。
5.交易回復:
當事務所包含的任意一個資料庫操作執行失敗後,應該復原(rollback)事務,使該事務中所做的修改全部失效。交易回復的方式有兩種:
(1)顯式復原:使用rollback關鍵字;
(2)隱式復原:系統錯誤或者強行退出。
6.MySQL中的事務支援:
(1)MySQL預設關閉事務(即開啟自動認可事務),在預設情況下,在MySQL控制台輸入一條DML語句,該語句會立刻儲存到資料庫中。可以使用下面的語句來開啟事務(即關閉自動認可事務):
set autocommit = 0;(註:set autoacommit = 1——預設關閉事務)
調用此命令後,上一個事務結束後的所有DML語句都屬於同一個事務中,除非使用commit提交事務,或者運行DDL語句或DCL語句隱式的提交事務,所有的DML語句都在同一個事務中。同樣也可以使用rollback復原來結束事務,但使用rollback將會使此事務中的DML語句全部失效。
註:使用set autocommit = 0 會使得整個Session(可以簡單理解為一個命令列視窗)開啟事務。
如果不想使得整個Session都開啟事務可以使用start transaction或begin這兩個命令臨時性的開啟事務,當DML語句組結束後再使用commit顯式的提交事務,或者使用DDL語句或DCL語句隱式的提交事務。
(2)普通的復原和提交都會導致事務的結束,如果使用savepoint設定事務的中間點,則rollback到中間點時,此事務不會結束。
7.有關事務提交和復原的例子:
(1)樣本1:
#建立一張表create table students( s_id int not null, s_name varchar(255) not null);#插入一條記錄insert into students values(1,‘ywl‘);#插入另一條記錄insert into students values(2,‘lj‘);#由於在MySQL中事務是預設關閉的,所以,以上兩條DML語句逐一執行時#就會被自動認可#執行查詢:結果是students表中有兩條記錄select * from students;#在此處臨時開啟MySQL的事務begin;#修改表中的資料update student set s_name=‘qq‘ where s_id=1;#注意,並未提交事務、#查詢一次:表被修改,但注意,這裡事務並未提交,查詢到的結果是個假象#哈哈select * from students;#進行復原事務rollback;#事務結束,由於rollback,修改表記錄的DML語句未執行#查詢該表,發現該表依然處於初始狀態select * from students;#使用start transaction與begin相同,使用同樣的例子試試就好#開啟所串連Session的事務set autocommit = 0;update student set s_name=‘qq‘ where s_id=1;update student set s_name=‘bb‘ where s_id=2;#執行到這裡其實並未提交事務,只有使用commit提交事務後#資料表才發生變化#提交事務commit;
(2)樣本2,為rollback設定中間點:
#開啟事務set autocommit = 0;#建立表create table teacher( t_id int not null, t_name varchar(255) not null);#注意,雖然這裡沒喲顯式的使用commit提交事務,但是#建表語句是一個DDL語句,所以其實此事務已被隱式提交#以下為一個新的事務insert into teacher values(1,‘a‘);insert into teacher values(2,‘b‘);#查詢一下#在teacher表中有內容select * from teacher;#直接復原事務rollback;#查詢teacher表,表中沒有記錄select * from teacher;#此時的事務已經結束,最終結果,沒有對teacher表進行操作#新的事務開始insert into teacher values(1,‘a‘);#設定rollback的中間點savepoint a;insert into teacher values(2,‘b‘);#查詢下teacher表select * from teacher;#復原到中間點rollback to a;#重新查詢下teacher表select * from teacher;#由於復原到中間點的rollback未關閉此事務,所以可以提交事務commit;#查詢teacher表 觀察結果select * from teacher;
MySQL的事務