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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/249968.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/249968.shtml
英文地址,請注明出處:http://en.pswp.cn/news/249968.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

記了老是忘記那就寫下來吧宏任務微任務

宏任務:script 定時器 微任務:promiss process.nexttick new Promise(function(resolve){console.log(3);//此為同步程序resolve();//同步 是否異步 由內部函數決定console.log(4); }).then(function(){ //。then 異步console.log(5); });async function…

SPRING自定義注入CONTROLLER變量

問題描述 在SpringMVC中默認可以注入Model,ModelAndView,RequestParam,PathVariable 等,那么這個是怎么實現的,以及怎么注入一個自定義的參數呢 HandlerMethodArgumentResolver 在SpringMVC中有一個接口HandlerMethod…

進程,線程

import os, timeif __name__ __main__:print(the calling process id:%d % os.getpid())# 創建進程pid os.fork()if pid 0:# 子進程print(the child pid is %d % os.getpid())time.sleep(3)elif pid > 0:# 父進程os.wait() # 等待子進程終止print([%d]bye-bye % os.getpi…

livebos--iframe使用

新建一個方法。建一個參數&#xff0c;iframe控件&#xff0c;虛擬列。然后使用以下信息 <% livebos languagejavascript %>var url LB_ObjURI("Lb_lbOrganization",0,[],["NoTitle"]);var v {"edit" : "url ", "view"…

單行溢出 和多行溢出

/*單行溢出*/.one_txt_cut{overflow: hidden;white-space: nowrap;text-overflow: ellipsis;}.txt_cut{overflow : hidden;text-overflow: ellipsis;display: -webkit-box;-webkit-line-clamp: 2;-webkit-box-orient: vertical;}轉載于:https://www.cnblogs.com/smzd/p/8491583…

Spring方法注入 @Lookup注解使用

情景分析 在Spring的諸多應用場景中bean都是單例形式&#xff0c;當一個單利bean需要和一個非單利bean組合使用或者一個非單利bean和另一個非單利bean組合使用時&#xff0c;我們通常都是將依賴以屬性的方式放到bean中來引用&#xff0c;然后以Autowired來標記需要注入的屬性。…

Jupyter配置步驟

Jupyter是基于瀏覽器的可交互式開發工具&#xff0c;在數據科學界非常受歡迎&#xff0c;它功能齊全&#xff0c;使用方便&#xff0c;是一款數據分析和建模挖掘的利器。 本文簡介Jupyter的配置和使用過程 一、修改添加國內鏡像 通常我會先安裝Anaconda&#xff0c;再安裝Jupyt…

edittext 屬性

1.去掉edittext的底線&#xff0c;設置&#xff0c;不管是edittext&#xff0c;還是appcompatEdittext都是這個屬性 轉載于:https://www.cnblogs.com/hechangshou/p/9301004.html

定義高亮顏色

/*怎么定義高亮的顏色*/-webkit-tap-highlight-color: transparent;/*透明 其實就是不顯示顏色*/-webkit-tap-highlight-color: red; 轉載于:https://www.cnblogs.com/smzd/p/8491587.html

springboot 配置webservice接口

導入依賴的jar <!-- webservice cxf --><dependency><groupId>org.apache.cxf</groupId><artifactId>cxf-rt-frontend-jaxws</artifactId><version>3.1.6</version></dependency><dependency><groupId>org…

【Django】認證系統

目錄 #. auth模塊1. 認證 authenticate()2. 登陸 login(HttpRequest, user)3. 注銷 logout(request)4. 認證判斷 is_authenticated()5. 登陸校驗 login_requierd()6. 創建普通用戶 create_user()7. 創建超級用戶 create_superuser()8. 密碼校驗 check_password(password)9. 修改…

學習的目的是什么?

學習的目的是為了掌握生存的常識和技能&#xff0c;以便獨立地面對世界&#xff1b; 學習的目的是為了遵從生活的規范和律則&#xff0c;以便和諧地與人相處&#xff1b; 學習的目的是為了探索生命的價值和意義&#xff0c;以便有尊嚴地立于天地之間。 你覺得為什么要學習呢&am…

span里面插入文字

.text-box span::before{ content:attr(data-text);} 轉載于:https://www.cnblogs.com/smzd/p/8491664.html

Spring Boot 動態注入的兩種方式

通過Profilespring.profiles.active spring.profiles.active&#xff1a;官方解釋是激活不同環境下的配置文件&#xff0c;但是實際測試發現沒有對應的配置文件也是可以正常執行的。那就可以把這個key當作一個參數來使用 Profile&#xff1a;spring.profiles.active中激活某配…

kernel devel 安裝與卸載

1、查看系統內核 uname -r 2、查看已安裝kernel-devel uname -a ; rpm -qa kernel\* | sort 3、下載對應的rpm wget xxx/kernel-devel-2.6.32-754.el6.x86_64.rpm 或者 $ sudo yum install "kernel-devel-uname-r $(uname -r)" 4、卸載已安裝的內核 yum remove ker…

彈性布局

/* 開啟彈性布局的換行 */ flex-wrap: wrap;/* 變為多行了 無法使用 align-items 進行位置設置 align-content 在多行的時候 設置屬性 跟 justify-content 一模一樣如果只有 一行時 無法生效 *//* 調整元素 在主軸上的 排布方式flex-end 到主軸的末尾flex-start 默認值center…

詳解 vue-cli 的打包配置文件代碼(給大家寫寫注釋)

一、前言 對于webpack基礎不好&#xff0c;node指令不通的童鞋。估計對自己搭建Vue、react腳手架是相當頭疼的&#xff0c;有種無從下手的感覺。然而&#xff0c;從頭看這2塊&#xff0c;耗時太長&#xff0c;而且說實話得練才行&#xff0c;不練練手看不明白。那大多數人就采取…

AutoFac自動注入時報錯

錯誤描述&#xff1a;An error occurred during the activation of a particular registration 解決辦法&#xff1a;看到了particular這個單詞&#xff0c;用我蹩腳的英語&#xff0c;估計是部分類&#xff1f;結合報錯的兩個類存在互相引用&#xff0c;這就明白了&#xff0c…

嘗試修改源碼需要用到git存一下

git reflog查看本地記錄 git reset --hard 02a3260 轉載于:https://www.cnblogs.com/smzd/p/8492065.html

poj3713 Transferring Sylla 枚舉+tarjan判割點

其實就是判斷是否為三連通圖 三連通圖指的是去掉3個點就不連通的圖&#xff0c;但是并沒有直接求三連通的算法。著名的Tarjan算法可以求解連通和割點&#xff0c;再枚舉刪除一個點就能達到三連通的目的。 先看用例2&#xff0c;是由用例1去掉一條邊而變成非三連通圖的&#xff…