日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

MySQL中事物的详解

發布時間:2023/12/13 数据库 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MySQL中事物的详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. 事物的定義及特性

事務是一組操作數據庫的SQL語句組成的工作單元,該工作單元中所有操作要么同時成功,要么同時失敗。事物有如下四個特性,ACID簡稱“酸性”。

1)原子性:工作單元中所有的操作要么都成功,要么都不成功,不會出現部分成功的情況。

2)一致性:工作完成其結果應與預期一致,比如由A賬戶向B賬戶轉賬的事物,若該事物執行成功則必須保證A賬戶轉出多少錢,B賬戶相應轉入多少錢;若該事物失敗,則此次轉賬即失敗。事物的其它三個性質都是為了保證該一致性的。

3)隔離性:隔離性還可以稱為并發控制、可串行化、鎖等。事物中所操作的數據要隔離起來,以防止其他用戶訪問這些數據而帶來的不一致情況。

4)持久性:事務一旦提交,其所做的修改就會永久保存到數據庫中,即使數據庫發生故障也不應該對其有任何影響。

事務的持久性不能做到100%的持久,只能從事務本身的角度來保證永久性,而一些外部原因導致數據庫發生故障,如硬盤損壞,那么所有提交的數據可能都會丟失。

2. MySQL中開啟事務的方法

2.1.方法一

用BEGIN或START?TRANSACTION來開啟一個事物,COMMIT或ROLLBACK來結束該事物。

-- 保存點 savepoint begin declare is_error int default false;#是否出錯的標志 declare continue handler for sqlexception set is_error=true;#聲明異常處理程序,如果sql異常,則把標志為設置為true start TRANSACTION;#開啟事務,則會同時失敗,同時成功 savepoint s1;#創建保存點 insert into employee(id,name,salary) values(146,'cq',9000); savepoint s2; insert into employee(id,name,salary) values(101,'cq',9000); insert into employee(id,name,salary) values(102,'cq',9000); if is_error THEN rollback to savepoint s1;-- 還原到s1 insert into employee(id,name,salary) values(151,'cq',9000); insert into employee(id,name,salary) values(152,'cq',9000); commit; end if; end; View Code

2.2.方法二

關閉自動提交,設置SET?AUTOCOMMIT?=?0,該語句后的所有操作都將變成事物操作,而且關閉自動提交的情況下,每個事物結束其后續操作都將開啟新的事物。

set autocommit=0;#關閉自動提交 #因為關閉了自動提交事務,則添加數據不會保存到數據庫中 insert into employee(id,name,salary) values(143,'cq',9000); commit;#手動提交所有未執行的數據 #由于是關閉自動提交的方式開啟的事務,所以每個事物結束其后的操作自動開啟新的事物 insert into employee(id,name,salary) values(258,'wd',8000); #該操作屬于新啟的事物

3. 事物的隱式提交

由于事物不能被嵌套,所以當新事物開啟時其前的舊事物會被隱式提交。如下情況會導致事物被隱式提交:

1)新事物的開啟會導致舊事物的隱式提交

START TRANSACTION; INSERT INTO `dm_性別`(性別名稱) VALUES('不限');#該操作會被隱式提交 START TRANSACTION; INSERT INTO `dm_性別`(性別名稱) VALUES('男女'); ROLLBACK;

2)InnoDB中所有的DDL或DCL操作都會開啟一個新的事物,所以DDL或DCL語句會導致舊事物的隱式提交

SET AUTOCOMMIT = 0;#利用法二關閉自動提交來開啟事務 BEGIN; INSERT INTO t1 VALUES (1); #該DDL語句會導致其前面的插入操作隱式提交 ,并開啟一單一的事物 CREATE TABLE t2 (pk int primary key); INSERT INTO t2 VALUES (2); #自動開啟新的事物 ROLLBACK; #插入表t1的數據已提交,僅能回滾插入表t2的操作

3)過程的執行區結束End之前會有一次隱式提交

BEGIN START TRANSACTION; INSERT INTO `dm_性別`(性別名稱) VALUES('不限'); INSERT INTO `dm_性別`(性別名稱) VALUES('男女'); END #在此之前會導致事物的隱式提交

4. 有關事物操作的注意事項

①? 存儲過程的執行區Begin會開啟一個事物,執行區結束End會隱式提交一次

BEGIN INSERT INTO `dm_性別`(性別名稱) VALUES('不限'); INSERT INTO `dm_性別`(性別名稱) VALUES('男女'); ## COMMIT隱式提交該執行區域的操作 END

②? 不要在事物的中途進行提交操作,一方面會破壞事物的原子性 ,另一方面該事物會到此結束

create table testproc(id int(4) primary key, name varchar(100)); #測試過程 CREATE PROCEDURE test_proc_ins( IN i_id INT, IN i_name VARCHAR(100) ) BEGIN start transaction; #本意是將兩次插入操作捆綁成一個事物 INSERT INTO testproc VALUES (i_id, i_name); COMMIT;#由于中途提交導致該事物提交前結束,其后的操作不再是事物操作INSERT INTO testproc VALUES (i_id, i_name); #這里故意違反主鍵約束 ROLLBACK;#由于第一條插入數據的操作已提交,故這里的ROLLBACK無效 END;

③? 由于DDL或DCL操作會創建新的事物,這導致其前的操作會隱式提交,從而破壞事物的原子性,所以盡量不要在過程中使用DDL或DCL語句。而且在過程中使用DDL或DCL語句的語法是比較復雜的,所以不建議在過程中使用DDL或DCL語句。

SET AUTOCOMMIT = 0; BEGIN; INSERT INTO t1 VALUES (1); #該DDL語句開啟新事物會隱式提交其前的事物 CREATE TABLE t2 (pk int primary key);
INSERT INTO t2 VALUES (2); ROLLBACK; SHOW TABLES

④? Start Transaction(Begin)與閉自動提交開啟事務的區別:

Start Transaction只開啟了一個當前事物,該事物結束其后的操作將不再是事物操作;但關閉自動提交的方式開啟事務,每個事物結束其后的操作自動默認為新的事物操作。

⑤? MySQL的事務支持不是綁定在MySQL服務器本身,而是與存儲引擎相關:

1.MyISAM:不支持事務,用于只讀程序提高性能

2.InnoDB:支持ACID事務、行級鎖、并發

3.Berkeley DB:支持事務

?

轉載于:https://www.cnblogs.com/leiblog/p/9298225.html

總結

以上是生活随笔為你收集整理的MySQL中事物的详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。