天天看點

sql事務的隔離級别以及一些MYSQL的指令

在sql标準中定義了4種隔離級别

1.未送出讀(read uncommitted):在未送出讀級别,事務的修改,即使沒有送出,對其他事務也是可見的,事務可讀未送出的資料,這也被稱為髒讀,(Dirty Read);當一個事務做UPDATE或者INSERT的時候,即使這個事務沒有送出,其他事務也可以讀取到已經修改完了的資料。由于事務有可能會復原,這個資料并不是最後的資料,是以是髒的,是以稱為髒讀。

2.送出讀(Read committed):大多數資料庫系統的預設隔離級别是送出讀(Mysql不是)送出讀滿足前面提到的隔離性的簡單定義:一個事務開始時,隻能“看見”已經送出的事務所做的修改。一個事務從開始到送出前,所做的修改是其他事務不可見的!(不可重複讀)。這個事務隔離級别比髒讀要高。當一個事務做UPDATE或者INSERT的時候,需要這個事務已經送出送出,其他事務才可以讀取到已經修改完了的資料。同時如果2個事務,事務A有2個或者多個查詢,第一個查詢完了之後,如果事務B已經送出,則事務A的第二個查詢看到的是事務B送出之後的資料。是以事務A的2個查詢有可能看到的不是同一個資料。

3.可重複讀( Repeatable read):可重複讀解決了髒讀的問題。該級别保證了在同一個事務中多次讀取同樣記錄的結果是一緻的。但是理論上,可重複讀隔離級别還是無法解決另外一個幻讀(Phantom read)問題。所謂幻讀,指的是當某個事務在讀取某個範圍内的記錄時,另外一個事務中又在該範圍插入了新的記錄,當之前的事務再次讀取該範圍的記錄時,會産生幻行(Phantom row)。可重複讀是MySQL的預設事務隔離級别。

在同一個事務中,多次查詢同樣的記錄,其結果是一樣的。測試一下:

A事務:

set autocommit=0;

a.select * from lc_user where id=2;

b.select * from lc_user where id=2;

B事務:

a.update lc_user set phone=42222222222222 where id=2;

執行A事務的a sql 結果為2

執行B事務并送出

執行A事務的b sql 結果為2

可串行化(Serializable):可串行化是最高的隔離級别。它通過強制事務串行執行,避免了前面所說的幻讀問題。簡單來說,可串行化會在讀取的每一行資料上都加上鎖,是以可能導緻大量的逾時和鎖争用問題。實際應用中也很少用到這個隔離級别,隻有在非常需要確定資料的一緻性而且可以接受沒有并發的情況下,才考慮用該級别。

next-key locking:間歇鎖定

show engines\G:檢視mysql支援的存儲引擎。

create table mytest engine=myisam;

檢視引擎 show engines \G;

檢視變量 show variables like ‘%binlog_format%’;

檢視狀态 show status like ‘%conn%’; mysql免登入執行指令 mysql -uroot -e “show slave status\G;”

mysql指定配置檔案登入 ./bin/mysql –defaults-file=/root/mysql/my.cnf -uroot

鎖表 FLUSH TABLES WITH READ LOCK;

解鎖 UNLOCK TABLES;

mysql調試文法 在報錯以後,執行SHOW WARNINGS;

可以看到詳細資訊 開放ROOT遠端通路,一般不要這麼做 GRANT ALL PRIVILEGES ON . TO ‘root’@’%’WITH GRANT OPTION; 亂碼 指令行登陸MySQL,

檢視編碼 mysql> show variables like ‘%character%’

建立資料庫 create database my_test; 授權 grant all privileges on my_test.* to my_test@’%’ identified by ‘my_test_123’;

修改root密碼 update mysql.user set password=password(‘open’) where user=’root’; flush privileges;

備份資料(其中可以人工指定socket參數 –socket=/application/search/mysql/mysql/tmp/mysql.sock) ./mysqldump -uroot my_test -v > /data0/search/my_test.sql ./mysqldump -uroot -popen opendata -v > /data0/search/my_test.sql 備份存儲過程和函數 ./mysqldump -uroot -popen -n -t -d -R opendata1 > /data0/search/opendata1_produce.sql 備份全部資料庫快照 mysqldump -uroot -p -h127.0.0.1 -P3306 –all-databases –triggers –routines –events >all.sql 導入 1)先登入,首先要登入mysql,可以看到導入過程,但是終端網絡斷開,則導入終止 source /data0/search/my_test.sql 2)無需登入,背景執行導入指令,但是看不到過程 ./mysql -uroot my_test < /data0/search/my_test.sql & 統計表行數 use INFORMATION_SCHEMA;

select TABLE_ROWS,TABLE_NAME, TABLE_SCHEMA from tables where TABLE_SCHEMA=’my_test’;

select sum(TABLE_ROWS) from tables where TABLE_SCHEMA=’my_test’;

檢視伺服器線程 show processlist;

檢視建立表的結構 show create table 表名;