當前位置:首頁 » 存儲配置 » mysql存儲過程開啟事務

mysql存儲過程開啟事務

發布時間: 2022-07-31 09:09:25

『壹』 mysql 存儲過程怎麼設置事務

CREATE DEFINER=`root`@`localhost` PROCEDURE `createBusiness`(parameter1 int)
BEGIN
#Routine body goes here...
DECLARE flag int DEFAULT parameter1;#聲明變數flag,將參數值賦給該變數
DECLARE uuidStr VARCHAR(32);#聲明一個長度為32位的字元串
DECLARE currentTime TIMESTAMP;#聲明一個類型為時間戳的變數
declare err INT default 0;#聲明一個整形變數err,默認值是0
declare continue handler for sqlexception set err=1;#當sqlexception handler捕捉到異常時,設置err=1

START TRANSACTION;#開始事務
WHILE flag>0 DO #注意: while不能空實現(在while塊中,裡面必須有語句)
#uuid()函數得到的字元串是'6ccd780c-baba-1026-9564-0040f4311e29',剔除裡面的-,得到一個32位的字元串
SET uuidStr = REPLACE(UUID(),'-','') ;
#得到當前的時間
SET currentTime = CURRENT_TIMESTAMP();
#執行插入語句,注意連接字元串的函數concat(str1,str2,...);其中str..也可以是數字類型
INSERT INTO
表名稱
(id,title,keyword,hasImage,isTodayHead,isShowInHome,isBigness,publishTime,originId,modify_time,isAnalysis)
VALUE
(uuidStr,CONCAT('事件標題',flag),CONCAT('關鍵字',flag),1,1,0,0,currentTime,CONCAT('xxxxxxx',flag),currentTime,1);
#每循環一次,flag要減去1,注意沒有flag--的語法
set flag = flag-1;
#在這里測試當err=1時,事務是否有了回滾,測試ok
#IF flag=7 THEN #注意在procere中給變數賦值要用到set,或在變數聲明時用default來父子,所以=號可以用來比較兩邊的值是否相等,<=>也可,區別先不去糾結。
#set err=1;
#END if;
END WHILE;

IF (err=0) THEN
commit;
select 'OK';
ELSE
rollback;
select 'err';
END IF;
END;

『貳』 mysql存儲過程執行是不是一個大的事務

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
INSERT INTO testproc VALUES (i_id, i_name); -- 語句1
INSERT INTO testproc VALUES (i_id, i_name); -- 語句2(因為id為PK,此語句將出錯)。
END;

要使整個存儲過程成為一個原子操作的辦法是:在存儲過程主體開始部分,指定開始一個事務。語句 2 失敗,語句 1 不會被 commit 到資料庫中,存儲過程將會在調用時拋出一個異常。

『叄』 mysql命令行什麼時候需要手動開啟事務

MySQL的事務如果不在任何修改,默認是自動提交的,也就是你只要執行一個SQL,回車之後這個SQL語句如果沒有任何問題,只需完成後是自動提交的。
控制這個功能的參數是:autocommit。如果這個參數的值是on或者1,那麼就是上面我說的那種現象。如果是off或者0,則表示不會自動提交事務。需要你顯示的去提交事務。否則鎖執行的SQL不會不會永久生效,只會對你當前命令行的session有效,退出MySQL後,執行的SQL語句將會別回滾。
當你需要兩個SQL語句同時成功或者同時失敗的時候,你可以手動地開啟一個事務。比如下面的場景:
你想向訂單表order_info表中插入一條新的訂單記錄,同時要想支付信息表payment_info中插入一條支付信息記錄,這個時候從業務的角度上來看,這兩個表中的插入操作,需要保持原子性(也就是事務的四大特性之一),也就是要麼都插入成功,要麼都插入失敗,不能存在訂單插入成功,支付插入失敗,反之也不可以。
要滿足上面的需求,你就需要手動的去開啟一個事務,在這個事務中去插入兩個表中的數據。然後再提交這個事務。如果這兩個表的插入操作,你不手動的開啟事務,MySQL自己會把兩個SQL語句分開放在兩個單獨的事務中。執行一個插入,就會自動提交一個事務,然後在執行另外一個插入,再自動提交另外一個事務。
在MySQL看來,這是兩個分別向兩個表中插入的SQL語句而已,它不會從業務上考慮這兩個SQL實際的業務邏輯背景是什麼。所以此時他會看成是兩個SQL語句,也就是兩個事務。
這樣的情況下就需要手動的開啟事務。

『肆』 如何在mysql 的存儲過程中使用事務

6.7 MySQL 事務與鎖定命令
6.7.1 BEGIN/COMMIT/ROLLBACK 句法
預設的,MySQL 運行在 autocommit 模式。這就意味著,當你執行完一個更新時,MySQL 將立刻將更新存儲到磁碟上。
如果你使用事務安全表 (例如 InnoDB、BDB),通過下面的命令,你可以設置 MySQL 為非 autocommit 模式:
SET AUTOCOMMIT=0
在此之後,你必須使用 COMMIT 來存儲你的更改到磁碟上,或者使用 ROLLBACK ,如果你希望忽略從你的事務開始所做的更改。
如果你希望為一系列語句從 AUTOCOMMIT 模式轉換,你可以使用 START TRANSACTION 或 BEGIN 或 BEGIN WORK 語句:
START TRANSACTION;
SELECT @A:=SUM(salary) FROM table1 WHERE type=1;
UPDATE table2 SET summmary=@A WHERE type=1;
COMMIT;
START TRANSACTION 在 MySQL 4.0.11 中被加入;這是被推薦的開始一個特別(ad-hoc)事務的方式,因為這是 ANSI SQL 句法。
注意,如果你使用的是一個非事務安全表,更改會立刻被存儲,不受 autocommit 模式狀態的約束。
當你更新了一個非事務表後,如果你執行一個 ROLLBACK,你將得到一個錯誤 (ER_WARNING_NOT_COMPLETE_ROLLBACK) 作為一個警告。所有事務安全表將被恢復,但是非事務安全表將不會改變。
如果你使用 START TRANSACTION 或 SET AUTOCOMMIT=0,你應該使用 MySQL
二進制日誌做備份以代替老的更新日誌。事務處理被以一個大塊形式存儲在二進制日誌中,在 COMMIT
上面,為了保護回滾的事務,而不是被存儲的。查看章節 4.9.4 二進制日誌。 如果您使用起動事務處理或集AUTOCOMMIT=0
,您應該使用MySQL 二進制日誌為備份代替更舊的更新日誌。 事務處理存儲在二進制登錄一大塊,做,保證, 滾的事務處理不存儲。 參見部分4
。9.4 二進制日誌。
下列命令自動的結束一個事務 (就好像你在執行這個命令之前,做了一個 COMMIT):
命令 命令 命令
ALTER TABLE BEGIN CREATE INDEX
DROP DATABASE DROP TABLE RENAME TABLE
TRUNCATE
你可以使用 SET TRANSACTION ISOLATION LEVEL ... 改變事務的隔離級。查看章節 6.7.3 SET TRANSACTION 句法。
6.7.2 LOCK TABLES/UNLOCK TABLES 句法
LOCK TABLES tbl_name [AS alias] {READ [LOCAL] | [LOW_PRIORITY] WRITE}
[, tbl_name [AS alias] {READ [LOCAL] | [LOW_PRIORITY] WRITE} ...]
...
UNLOCK TABLES
LOCK TABLES 為當前線程鎖定表。UNLOCK TABLES 釋放當前線程擁有的所有鎖定。當線程發出另一個 LOCK TABLES,或當與伺服器的連接被關閉時,被當前線程鎖定的所有表將被自動地解鎖。
為了在 MySQL 4.0.2 使用 LOCK TABLES ,你必須擁有一個全局的 LOCK TABLES 許可權和一個在相關表上的
SELECT 許可權。在 MySQL 3.23 中,你對該表需要有 SELECT、insert、DELETE 和 UPDATE 許可權。
使用 LOCK TABLES 的主要原因是,仿效事務處理或在更新表時得到更快的速度。此後會有更詳細的描述。
如果一個線程在一個表上得到一個 READ 鎖,該線程 (和所有其它線程) 只能從表中讀取。如果一個線程在一個表上得到一個 WRITE 鎖,那麼只有擁有這個鎖的線程可以從表中讀取和寫表。其它的線程被阻塞。
READ LOCAL 和 READ 之間的不同就在於,當鎖被載入時,READ LOCAL 允許非沖突(non-conflicting) INSERT 語句執行。如果當你載入著鎖時從 MySQL 外部操作資料庫文件,這將仍不能被使用。
當你使用 LOCK TABLES 是地,你必須鎖定所有你將使用的表,並且必須使用與你的查詢中將使用的別名相同!如果你在一個查詢中多次使用一個表(用別名),你必須為每一個別名獲得一個鎖。
WRITE 鎖通過比 READ 鎖有更高的許可權,以確保更新被盡快地處理。這就意味著,如果一個線程獲得一個 READ
鎖,而同時另外一個線程請求一個 WRITE 鎖,並發的 READ 鎖請求將等待直到 WRITE 線程得到了鎖並釋放了它。你可以使用
LOW_PRIORITY WRITE 鎖,當該線程在等待 WRITE 鎖時,它將允許其它的線程獲得 READ 鎖。 你應該只使用
LOW_PRIORITY WRITE 鎖,如果你確信這將是最後一次,當沒有線程將擁有 READ 鎖。
LOCK TABLES 工作如下:
以內部定義的次序排序所有被鎖定的表 (從用戶立場說,該次序是不明確的)。
如果一個表被以一個讀鎖和一個寫鎖鎖定,將寫鎖放在讀鎖之前。
一次只鎖定一個表,只到線程得到所有的鎖定。
這個方案是為了確保,表鎖定死鎖釋放。 對於這個模式你仍然有些其它事情需要知道:
如果你對一個表使用一個 LOW_PRIORITY WRITE 鎖定,這就意味著,MySQL 將等待這個鎖,直到沒有線程請求一個 READ
鎖。當線程得到了 WRITE 鎖,並等待獲得鎖定表列表中的下一個表的鎖定時,其它所有的線程將等待 WRITE
鎖被釋放。如果這在你的應用程序中會引起一個嚴重的問題,你應該考慮將你的某些表轉換為事務安全表。
你可以使用 KILL 安全地殺死一個正在表鎖定的線程。查看章節 4.5.5 KILL 句法。
注意,你不應該 鎖定你正在對其使用 INSERT DELAYED 的表。這是因為,在這種情況下,INSERT 是通過單獨的線程完成的。
通常,你不需要鎖定任何錶,因為所有單 UPDATE 語句都是原子的;其它的線程無法干擾當前執行的 SQL 語句。當你無論如何希望鎖定表時,這里有一些情況:
如果你在一束表上運行許多操作,鎖定你將要使用的表,這會更快一些。當然有不利的方面,其它線程將不能更新一個 READ
鎖的表,並且沒有其它線程要以讀取一個 WRITE 鎖的表。 在 LOCK TABLES 下,某些事運行得更快一些的原因是,MySQL
將不會轉儲清除被鎖定表鍵高速緩沖,直到 UNLOCK TABLES 被調用 (通常鍵高速緩沖在每個 SQL 語句後都會被轉儲清除)。這將加速在
MyISAM 表上的插入、更新、刪除。
如果你在 MySQL 中正在使用一個不支持事務的存儲引擎,如果你希望能確保沒有其它的線程會出現在一個 SELECT 和 一個 UPDATE 之間,你必須使用 LOCK TABLES 。下面的示例顯示為了安全地執行,這里需要LOCK TABLES :
mysql> LOCK TABLES trans READ, customer WRITE;
mysql> SELECT SUM(value) FROM trans WHERE customer_id=some_id;
mysql> UPDATE customer SET total_value=sum_from_previous_statement
-> WHERE customer_id=some_id;
mysql> UNLOCK TABLES;
不使用 LOCK TABLES,將可能發生在 SELECT 和 UPDATE 語句執行期間有另外一個線程可能在 trans 表中插入一行新記錄。
通過使用遞增更新 (UPDATE customer SET value=value+new_value) 或 LAST_INSERT_ID() 函數,你可以在很多情況下避免使用 LOCK TABLES。
你也可以使用用戶級鎖定函數 GET_LOCK() 和 RELEASE_LOCK() 解決一些情況,這些鎖被保存在伺服器上的一個哈希表中,並以
pthread_mutex_lock() 和 pthread_mutex_unlock() 實現以獲得高速度。查看章節 6.3.6.2
輔助功能函數。
查看章節 5.3.1 MySQL 如何鎖定表,以獲取關於鎖定方案的更多信息。
你可以使用 FLUSH TABLES WITH READ LOCK 命令以讀鎖鎖定所有資料庫中的所有表。查看章節 4.5.3 FLUSH 句法。如果你有一個可以及時建立文件快照的文件系統,例如 Veritas,這將是得到備份的非常方便方式。
注意:LOCK TABLES 不是事務安全的,在嘗試鎖定一個表之前,將自動地提交所有的活動事務。
6.7.3 SET TRANSACTION 句法
SET [GLOBAL | SESSION] TRANSACTION ISOLATION LEVEL
{ READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE }
設置全局的、整個會話或下一個事務的事務隔離級。
預設行為是設置下一個(未啟動的)事務的隔離級。如果你使用 GLOBAL
關鍵詞,語句為所有在那個點上建立的新連接設置默認的全局事務隔離級。為了這樣做,你需要有 SUPER 許可權。使用 SESSION
關鍵詞為當前連接所有將來執行的事務設置默認的事務隔離級。
你可以使用 --transaction-isolation=... 為 mysqld 設置默認的全局隔離級。查看章節 4.1.1 mysqld 命令行選項

『伍』 mysql怎麼開啟事務 MySQL命令行控制事務

先用CD命令進到mysql的BIN目錄然後 mysql -uroot -p再輸入ROOT的密碼就行了就可以了

『陸』 mysql select 會開啟事務嗎

SELECT,INSERT,UPDATE或DELETE都會開啟事務。
如果AUTOCOMMIT設置為1(默認值),每一個SQL語句都被認為是一個完整的事務。
AUTOCOMMIT設置為0時,在隨後的一系列語句的作用就像一個事務,直到一個明確的COMMIT語句結束。

『柒』 mysql的存儲過程會自動開啟一個事務嗎

事務是一組原子性的SQL查詢語句,也可以被看做一個工作單元。如果資料庫引擎能夠成功地對資料庫應用所有的查詢語句,它就會執行所有查詢,如果任何一條查詢語句因為崩潰或其他原因而無法執行,那麼所有的語句就都不會執行。也就是說,事務內的語句要麼全部執行,要麼一句也不執行。

『捌』 mysql 事務存儲過程怎麼寫

mysql
事務存儲過程怎麼寫
6.7
MySQL
事務與鎖定命令
6.7.1
BEGIN/COMMIT/ROLLBACK
句法
預設的,MySQL
運行在
autocommit
模式。這就意味著,當你執行完一個更新時,MySQL
將立刻將更新存儲到磁碟上。

『玖』 Mysql中的事務是什麼如何使用

(1)在執行sql語句之前,我們要開啟事務 start transaction;

(2)正常執行我們的sql語句

(3)當sql語句執行完畢,存在兩種情況:

1,全都成功,我們要將sql語句對資料庫造成的影響提交到資料庫中,committ

2,某些sql語句失敗,我們執行rollback(回滾),將對資料庫操作趕緊撤銷

(注意:mysql數據支持事務,但是要求必須是innoDB存儲引擎)
mysql> create table bank(name varchar(20),money decimal(5,1))engine=innodb defau
lt charset=utf8;

mysql> inset into bank values('shaotuo',1000),('laohu',5000);

mysql> select*from bank;
+---------+--------+
| name | money |
+---------+--------+
| shaotuo | 1000.0 |
| laohu | 5000.0 |
+---------+--------+

------沒有成功「回滾」執行rollback
mysql> start transaction; //開啟事務
Query OK, 0 rows affected (0.00 sec)

mysql> update bank set money=money+500 where name='shaotuo';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0

mysql> update bank set moey=money-500 where name='laohu';
ERROR 1054 (42S22): Unknown column 'moey' in 'field list'
mysql> rollback; //只要有一個不成功,執行rollback操作
Query OK, 0 rows affected (0.01 sec)

『拾』 navicate怎麼在mysql的定時事務開啟

1、啟動Navicat for MySQL,新建資料庫連接,打開資料庫,可能有點啰嗦。

2、可以先查看定時任務的是否開啟。通過以下命令:show variables like '%sche%';

3、如果其設置值為為 OFF 或 0 ,通過執行下列語句,來開啟event_scheler,set global event_scheler =1,把設置為設為ON 或 1。

4、新建一個函數 ,取名為update_qian ,內容為 UPDATE week7_user SET isqian = 0

6、完成結束

熱點內容
下沉演算法 發布:2024-10-05 21:59:43 瀏覽:995
資料庫管理系統的開發 發布:2024-10-05 21:58:02 瀏覽:139
人員最低配置方案怎麼寫 發布:2024-10-05 21:56:26 瀏覽:765
智邦國際伺服器ip 發布:2024-10-05 21:47:37 瀏覽:596
python英文怎麼讀 發布:2024-10-05 21:47:02 瀏覽:145
魔獸世界退役伺服器有什麼用處 發布:2024-10-05 20:50:00 瀏覽:195
新車配置不符怎麼投訴 發布:2024-10-05 20:49:00 瀏覽:389
編譯的html文件 發布:2024-10-05 20:48:58 瀏覽:161
python自學網站 發布:2024-10-05 20:46:08 瀏覽:19
存儲在rom中的數據當計算機斷電後 發布:2024-10-05 20:43:46 瀏覽:10