當前位置:首頁 » 存儲配置 » mysql存儲過程日誌

mysql存儲過程日誌

發布時間: 2022-10-10 19:53:33

A. Mysql備份資料庫時需要備份的對象有哪些

資料庫備份對象包含數據,表結構,創建存儲過程,日誌等。
1、 mysqlmp命令備份數據
在MySQL中提供了命令行導出資料庫數據以及文件的一種方便的工具mysqlmp,我們可以通過命令行直接實現資料庫內容的導出mp,首先我們簡單了解一下mysqlmp命令用法:
#MySQLmp常用
mysqlmp -u root -p --databases 資料庫1 資料庫2 > xxx.sql
2、 mysqlmp常用操作實例
2.1備份全部資料庫的數據和結構
mysqlmp -uroot -p123456 -A > /data/mysqlDump/mydb.sql
2.2備份全部資料庫的結構(加 -d 參數)
mysqlmp -uroot -p123456 -A -d > /data/mysqlDump/mydb.sql
2.3 備份全部資料庫的數據(加 -t 參數)
mysqlmp -uroot -p123456 -A -t > /data/mysqlDump/mydb.sql
2.4 備份單個資料庫的數據和結構(,資料庫名mydb)
mysqlmp -uroot-p123456 mydb > /data/mysqlDump/mydb.sql
2.5 備份單個資料庫的結構
mysqlmp -uroot -p123456 mydb -d > /data/mysqlDump/mydb.sql
2.6 備份單個資料庫的數據
mysqlmp -uroot -p123456 mydb -t > /data/mysqlDump/mydb.sql2
2.7 備份多個表的數據和結構(數據,結構的單獨備份方法與上同)
mysqlmp -uroot -p123456 mydb t1 t2 > /data/mysqlDump/mydb.sql
2.8 一次備份多個資料庫
mysqlmp -uroot -p123456 --databases db1 db2 > /data/mysqlDump/mydb.sql

B. mysql 存儲過程

你應該在做統計吧,估計你不會的就是mysql存儲過程的語法 我之前也寫過 很是郁悶 我給你一段代碼 是我用mysql寫過的一個存儲過程 你看看 主要是了解裡面的語法 看懂了 你所說的需求並不難
有看不懂的地方一起討論 :
begin

declare tikk datetime ;
declare done int default 0;
declare userid int default 0;
declare moleid int default 0;
declare couid int default 0;
declare mname varchar(255) ;
declare opsid int default 0;

declare c1 cursor for Select I_userID,I_operationID from space_operation_record where status<>0 group by I_userID,I_operationID order by createtime desc;
declare continue handler for sqlstate '02000' set done =1;
set tikk = now();
open c1;
repeat
fetch c1 into userid, opsid;
if not done then
select I_moleID from space_operation where status<>0 and ID=opsid into moleid;
if moleid <> '' then
select Nvc_identification from space_operation where status<>0 and ID=opsid into @identiftion;
if moleid > 0 then
Select Nvc_ename from space_mole where status<>0 and ID=moleid into mname;
else
set mname = 'space';
end if;

create temporary table if not exists sp_tab1(id bigint(20),Nvc_content MEDIUMTEXT,I_obyuID bigint(20),I_tID bigint(20),createtime datetime);
INSERT INTO sp_tab1 Select ID,Nvc_content,I_objectID,I_tmID,createtime from space_operation_record where status<>0 and I_operationID=opsid and I_userID=userid ;
select count(*) from sp_tab1 into couid;

set @ihod = 0;
set @listp = '';
set @listpp = '';
set @content0p = '';
set @content0 = '';
while couid > 0 do
select ID,Nvc_content,I_obyuID,createtime,I_tID into @iok,@conuiy,@objiplk,@crtimhr,@tmids from sp_tab1 where ID > @ihod order by ID asc limit 0,1;
if @iok <> '' then
if mname = 'blog' then
INSERT INTO space_operation_stat(I_operationID,I_userID,Nvc_content,D_stattime,createtime) VALUES (@iok,userid,@conuiy,@crtimhr,tikk);
elseif mname = 'team' then
if(@identiftion = 'addblog' || @identiftion = 'mdyblog') then
INSERT INTO space_operation_stat(I_operationID,I_userID,Nvc_content,D_stattime,I_tmID,createtime) VALUES (@iok,userid,@conuiy,@crtimhr,@tmids,tikk);
else
set @listpp = CONCAT(@listpp,CONCAT(@objiplk,','));
set @operarry1p = substring_index(@conuiy,'|',1);
set @operarry2p = substring_index(@conuiy,'|',-1);
set @content0p = CONCAT(@content0p,CONCAT(@operarry2p,SPACE(1)));
set @objlistp = substring(@listpp,1,length(@listpp)-1);
end if;
elseif mname = 'space' then
if(@identiftion = 'headphoto' || @identiftion = 'status') then
INSERT INTO space_operation_stat(I_operationID,I_userID,Nvc_content,D_stattime,I_tmID,createtime) VALUES (@iok,userid,@conuiy,@crtimhr,@tmids,tikk);
else
set @listppr = CONCAT(@listppr,CONCAT(@objiplk,','));
set @operarry1pr = substring_index(@conuiy,'|',1);
set @operarry2pr = substring_index(@conuiy,'|',-1);
set @content0pr = CONCAT(@content0pr,CONCAT(@operarry2pr,SPACE(1)));
set @objlistpr = substring(@listppr,1,length(@listppr)-1);
end if;
else
set @listp = CONCAT(@listp,CONCAT(@objiplk,','));
set @operarry1 = substring_index(@conuiy,'|',1);
set @operarry2 = substring_index(@conuiy,'|',-1);
set @content0 = CONCAT(@content0,CONCAT(@operarry2,SPACE(1)));
set @objlist = substring(@listp,1,length(@listp)-1);
end if;
set @ihod = @iok;
end if;
set couid = couid -1;
end while;

if @content0 <> '' then
set @contentp = CONCAT(@operarry1,concat('|',@content0));
Select createtime,ID into @uitimej,@IDjok from space_operation_record where status<>0 and I_operationID=opsid order by createtime desc limit 0,1;
if @uitimej <> '' then
INSERT INTO space_operation_stat(I_operationID,I_userID,Nvc_content,D_stattime,createtime,Nvc_objlist) VALUES(@iok,userid,@contentp,@crtimhr,tikk,@objlist);
end if;
end if;
if @content0p <> '' then
if @identiftion = 'addphoto' then
set @contentp = CONCAT(@operarry1p,CONCAT('|',@content0p));
else
set @contentp = CONCAT(@operarry1p,CONCAT(@content0p,'|'));
end if;

Select createtime,ID into @uitimej,@IDjok from space_operation_record where status<>0 and I_operationID=opsid order by createtime desc limit 0,1;
if @uitimej <> '' then
INSERT INTO space_operation_stat(I_operationID,I_userID,Nvc_content,D_stattime,createtime,Nvc_objlist,I_tmID) VALUES(@iok,userid,@contentp,@crtimhr,tikk,@objlistp,@tmids);
end if;
end if;
if @content0pr <> '' then
set @contentp = CONCAT(@operarry1p,concat('|',@content0pr));
Select createtime,ID into @uitimej,@IDjok from space_operation_record where status<>0 and I_operationID=opsid order by createtime desc limit 0,1;
if @uitimej <> '' then
INSERT INTO space_operation_stat(I_operationID,I_userID,Nvc_content,D_stattime,createtime,Nvc_objlist,I_tmID) VALUES(@iok,userid,@contentp,@crtimhr,tikk,@objlistp,@tmids);
end if;
end if;
delete from sp_tab1;
end if;
end if;

until done end repeat;
close c1;
drop temporary table if exists sp_tab1 ;

UPDATE space_operation_play SET status=0;
UPDATE space_operation_display SET status=0;
Select createtime into @ptimes from space_operation_stat where status<>0 order by createtime desc limit 0,1;
if @ptimes <>'' then
create temporary table if not exists sp_tab2(id bigint(20),Nvc_content MEDIUMTEXT,I_userID bigint(20),I_lyuID bigint(20),D_stattime datetime);
INSERT INTO sp_tab2 Select ID,Nvc_content,I_userID,I_tmID,D_stattime from space_operation_stat where status<>0 and createtime=@ptimes order by D_stattime desc limit 0,30;
select count(*) from sp_tab2 into @cou1id;
set @uoj = 0;
while @cou1id > 0 do
select ID,Nvc_content,I_userID,D_stattime,I_lyuID into @io1k,@conui1y,@objipl1k,@crtimh1r,@unlpa from sp_tab2 where ID > @uoj order by ID asc limit 0,1;
if @io1k <> '' then
INSERT INTO space_operation_play(I_statID,Nvc_content,D_stattime,I_userID,Createtime,I_tmID) VALUES (@io1k,@conui1y,@crtimh1r,@objipl1k,now(),@unlpa);
set @uoj = @io1k;
end if;
set @cou1id = @cou1id -1;
end while;
drop temporary table if exists sp_tab2 ;
end if;

end

C. mysql的存儲過程怎麼寫

DELIMITER $$

USE `test`$$

DROP PROCEDURE IF EXISTS `proc_now_time`$$

CREATE DEFINER=`root`@`%` PROCEDURE `proc_now_time`(OUT `now_time` TEXT)
BEGIN
#Routine body goes here...
DECLARE
now_time TEXT;
select name ,age from test1,test2 INTO now_time;
SELECT now_time;
END$$

DELIMITER ;

D. mysql 存儲過程

.關於MySQL的存儲過程

存儲過程是資料庫存儲的一個重要的功能,但是MySQL在5.0以前並不支持存儲過程,這使得MySQL在應用上大打折扣。好在MySQL 5.0終於開始已經支持存儲過程,這樣即可以大大提高資料庫的處理速度,同時也可以提高資料庫編程的靈活性。

MySQL存儲過程的創建

(1).格式

MySQL存儲過程創建的格式:CREATE PROCEDURE過程名([過程參數[,...]])
[特性...]過程體

這里先舉個例子:

  • mysql>DELIMITER//

  • mysql>CREATEPROCEDUREproc1(OUTsint)

  • ->BEGIN

  • ->SELECTCOUNT(*)INTOsFROMuser;

  • ->END

  • ->//

  • mysql>DELIMITER;


  • 註:
  • (1)這里需要注意的是DELIMITER //和DELIMITER ;兩句,DELIMITER是分割符的意思,因為MySQL默認以";"為分隔符,如果我們沒有聲明分割符,那麼編譯器會把存儲過程當成SQL語句進行處理,則存儲過程的編譯過程會報錯,所以要事先用DELIMITER關鍵字申明當前段分隔符,這樣MySQL才會將";"當做存儲過程中的代碼,不會執行這些代碼,用完了之後要把分隔符還原。

    (2)存儲過程根據需要可能會有輸入、輸出、輸入輸出參數,這里有一個輸出參數s,類型是int型,如果有多個參數用","分割開。

    (3)過程體的開始與結束使用BEGIN與END進行標識。

E. mysql 存儲過程 DDL 參數

MySQL8.0 開始支持原⼦ DDL(atomic DDL),數據字典的更新,存儲引擎操作,寫⼆進制日誌結合成了一個事務。在沒有原⼦DDL之前,DROP TABLE test1,test2;如遇到server crash,可能會有test1被drop了,test2沒有被drop掉。下面來看下在MySQL8.0之前和MySQL8.0 數據字典的區別

在MySQL8.0 之前,Data Dictionary除了存在與.FRM, .TRG, .OPT ⽂件外,還存在於系統表中(MyISAM ⾮事務引擎表中),在MySQL8.0 ,Data Dictionary 全部存在於Data Dictionary Storage Engine(即 InnoDB表中),這使crash recovery 維持原⼦性成為了可能


存儲引擎⽀持

目前,只有InnoDB存儲引擎⽀持原子DDL,為了實現原子DDL,Innodb要寫DDL logs 到 mysql.innodb_ddl_log 表,這是⼀個隱藏在mysql.ibd 數據字典表空間⾥的數據字典表。要看mysql.innodb_ddl_log 中的內容,需要

SET GLOBALLOG_ERROR_VERBOSITY=3;(MySQL 8.0 默認為2,error log 記錄Errors and

warnings,不不記錄notes)

SET GLOBAL innodb_print_ddl_logs=1;

CREATE TABLEt1 (c1 INT)ENGINE=InnoDB;

查看error log

[Note] [MY-011066] InnoDB: DDL loginsert: [DDLrecord:DELETE SPACE,id=30,

thread_id=25, space_id=9, old_file_path=./test/t1.ibd]

[Note] [MY-011066]InnoDB:DDL logdelete:by id30

[Note] [MY-011066]InnoDB:DDL loginsert: [DDLrecord: REMOVECACHE,id=31,

thread_id=25, table_id=1066, new_file_path=test/t1]

[Note] [MY-011066]InnoDB:DDL logdelete:by id31

[Note] [MY-011066]InnoDB:DDL loginsert: [DDLrecord: FREE,id=32, thread_

id=25, space_id=9, index_id=143, page_no=4]

[Note] [MY-011066]InnoDB:DDL log delete:by id32

[Note] [MY-011066]InnoDB:DDL logpost ddl :begin for thread id: 25

[Note] [MY-011066]InnoDB:DDL logpost ddl :end for thread id: 25


原子DDL 操作步驟

  • 准備:創建所需的對象並將DDL⽇志寫入 mysql.innodb_ddl_log表中。DDL日誌定義了如何前滾和回滾DDL操作。

  • 執行:執⾏DDL操作。例如,為CREATE TABLE操作執⾏創建。

  • 提交:更新數據字典並提交數據字典事務。

  • Post-DDL:重播並從mysql.innodb_ddl_log表格中刪除DDL⽇志。為確保回滾可以安全執⾏⽽不引⼊不⼀致性,在此最後階段執⾏⽂件操作(如重命名或刪除數據文件)。這一階段還從 mysql.innodb_dynamic_metadata的數據字典表刪除的動態元數據為了DROP TABLE,TRUNCATE和其它重建表的DDL操作。

  • ⽆論事務是提交還是回滾,DDL日誌都會mysql.innodb_ddl_log在Post-DDL階段重播並從表中刪除 。mysql.innodb_ddl_log如果伺服器在DDL操作期間暫停,DDL⽇志應該只保留在表中。在這種情況下,DDL⽇志會在恢復後重播並刪除。

    在恢復情況下,當伺服器重新啟動時,可能會提交或回退DDL事務。如果在重做⽇志和⼆進制日誌中存在DDL操作的提交階段期間執⾏的數據字典事務,則該操作被認為是成功的並且被前滾。否則,在InnoDB重放數據字典重做日誌時回滾不完整的數據字典事務 ,並且回滾DDL事務。

    原⼦DDL ⽀持類型

    • DROP TABLES , all tables dropped or none

    • DROP SCHEMA, all entities in the schema are dropped, or none

    • Note that atomic DDL statements will be rolled back or committed even in case of crash, e.g. RENAME TABLES

    • CREATE TABLE would be successfully committed or rolled back (no orphan ibd left)

    • TRUNCATE TABLE (including InnoDB tables with FTS AUX tables) would be successfully committed or rolled back

    • RENAME TABLES, all or none

    • ALTER TABLE successful or not done

    示例

    結論

    在MySQL8.0之前,alter table 操作在server crash的情況下,會遺留.frm,.ibd文件。MySQL8.0 能實現原⼦DDL(包括 DROP TABLE, DROP SCHEMA, CREATE TABLE, TRUNCATE TABLE, ALTER TABLE),alter table 操作,在server crash的情況下,不會遺留.frm,.ibd臨時文件。讓我們⼀起期待MySQL8.0 GA的到來吧!

F. 關於mysql 的存儲過程

mysql> delimiter //
這個作用是把;變成//,以後的語句遇到//就結束了,遇到;不結束,下面就可以按你的想法寫了

mysql> CREATE PROCEDURE simpleproc (OUT param1 INT)
-> BEGIN
-> SELECT COUNT(*) INTO param1 FROM t;
-> END
-> //
Query OK, 0 rows affected (0.00 sec)

mysql> delimiter ; 這里把雙引號改回來

聲明參數要在說明是 輸入還是輸出函數 in\out

給函數變數賦值用
set @a=10;

例子:

drop procere if exists pr_param_in;

create procere pr_param_in
(
in id int -- in 類型的 MySQL 存儲過程參數
)
begin
if (id is not null) then
set id = id + 1;
end if;

select id as id_inner;
end;
set @id = 10;

call pr_param_in(@id);

select @id as id_out;
mysql> call pr_param_in(@id);

G. 如何在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 命令行選項

H. 求一個詳細的mysql 存儲過程例子,帶寫日誌的那種,不要也不要太簡單啊。

如果想帶日誌只有自己寫了,可以使用row_count()返回改的的行數
例如
create procere p_a1(in p_id int,in p_name varchar(20),out p_out varchar(200))
begin
declare p_cm int;
set p_cm = 0;
insert into a1(id,name) values(p_id,p_name);
select row_count() into p_cm;
if (p_cm = 1)
then
set p_out = '成功';
else
set p_out = '不成功';
end if;
end;

mysql> call p_a1(5,'KK',@a2)//
Query OK, 1 row affected (0.01 sec)
mysql> select @a2//
+--------+
| @a2 |
+--------+
| 成功 |
+--------+
1 row in set (0.01 sec)

以上來自手打,希望對你有幫助!呵呵~

熱點內容
C語言a35a4a5 發布:2025-05-14 11:53:48 瀏覽:809
android隱藏item 發布:2025-05-14 11:43:56 瀏覽:325
javawebeclipse編譯 發布:2025-05-14 11:35:24 瀏覽:935
可編程式控制制器試題 發布:2025-05-14 11:25:32 瀏覽:119
dsp混合編程 發布:2025-05-14 11:23:10 瀏覽:248
mysql添加存儲過程 發布:2025-05-14 11:23:01 瀏覽:879
房車旅遊自媒體有腳本嗎 發布:2025-05-14 11:18:18 瀏覽:125
android輸入法鍵盤 發布:2025-05-14 11:15:48 瀏覽:658
谷歌商店安卓手機在哪裡 發布:2025-05-14 11:13:46 瀏覽:535
編程貓銷售女 發布:2025-05-14 11:13:36 瀏覽:335