国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

MySQL數據庫的使用

2019-11-08 20:44:38
字體:
來源:轉載
供稿:網友

1: MySQL數據庫的安裝

     在Ubuntu上只需要如下幾條簡單的命令即可安裝完畢

      

      其中第一條命令用于安裝MySQL的服務器程序,第二條命令用于客戶端登錄操作mysql-server,第三條命令用于編寫客戶端程序時使用。

      通過上面安裝完畢后,查看是否安裝成功:

   

   更改配置文件,使MySQL支持遠程登錄(修改/etc/mysql/my.cnf文件):

   

   以安裝默認的root用戶登錄mysql:

   # mysql –h 127.0.0.1 –u root –p

   登錄后創建一個測試用戶(用戶名:test_user,密碼:123456):

   # create user ‘test_user’@’%’ identified by ‘123456’;

   為創建的用戶授權(目前授予最大權限,方便操作):

    # grant all PRivileges on *.* to ‘test_user’@’%’ ; 

   創建一個測試數據庫:

   createdatabase testdb;

2: MySQL的簡單使用示例

#include <mysql/mysql.h>#include <stdio.h>#include <stdlib.h>int main(int argc,char *argv[]){        MYSQL *conn = NULL;        MYSQL_RES *res = NULL;        MYSQL_ROW row;        const char *mysql_server="192.168.59.129";        const char *username = "test_user";        const char *passWord = "123456";        const char *database = "mysql";        const unsigned short port = 3306;        conn = mysql_init(NULL);        if(!mysql_real_connect(conn,mysql_server,username,password,database,port,NULL,0))        {                fprintf(stderr,"%s/n",mysql_error(conn));                return -1;        }        if(mysql_query(conn,"show tables"))        {                fprintf(stderr,"%s/n",mysql_error(conn));                return -2;        }        res = mysql_use_result(conn);        printf("MYSQL tables in mysql database:/n");        while((row=mysql_fetch_row(res)) != NULL)        {                printf("%s/n",row[0]);        }        mysql_free_result(res);        mysql_close(conn);        printf("/n--------------------/n");        printf("finish/n");        getchar();        return 0;} 編譯:gcc -o mysql_client mysql_client.c -lmysqlclient

3:數據庫事務的隔離級別

       數據庫事務的隔離級別有4個,由低到高依次為readuncommitted, read committed, repeatable read, serializable,這四個級別可以逐個解決臟讀、不可重復讀、幻讀這幾類問題。

注意:我們討論隔離級別的場景,主要是在多個事務并發的情況下,因此,接下來的講解都圍繞事務并發。

 

3.1) Readuncommitted

      公司發工資了,領導把5000元打到singo的賬號上,但是該事務并未提交,而singo正好去查看賬戶,發現工資已經到賬,是5000元整,非常高興。可是不幸的是,領導發現發給singo的工資金額不對,是2000元,于是迅速回滾了事務,修改金額后,將事務提交,最后singo實際的工資只有2000元,singo空歡喜一場。

出現上述情況,即我們所說的臟讀,兩個并發的事務,“事務A:領導該singo發工資”、“事務B:singo查詢工資賬戶”,事務B讀取了事務A尚未提交的的數據。

當隔離級別設置為Readuncommitted時,就可能出現臟讀,如何避免臟讀,請看下一個隔離級別。

3.2) Readcommitted

       Singo拿著工資卡去消費,系統讀取到卡里確實有2000元,而此時他的老婆也正好在網上轉賬,把singo的工資卡的2000元轉到另一賬戶,并在singo之前提交了事務,當singo扣款時,系統檢查到singo的工資卡已經沒有錢,扣款失敗,singo十分納悶,明明卡里有錢,為何….

       出現上述情況,即我們所說的不可重復讀,兩個并發事務:“事務A:singo消費”、“事務B:singo的老婆網上轉賬”。事務A先讀取了數據,事務B緊接著更新了數據,并提交了事務,而事務A再次讀取該數據時,數據已經發生了改變。

       當隔離級別設置為Readcommitted時,避免了臟讀,但是可能會造成不可重復讀。

       大多數數據庫的默認級別就是Readcommitted,比如sql server, Oracle。如何解決不可重復讀這一問題,請看下一個隔離級別。

3.3) RepeatableRead

        當隔離級別被設置為Repeatable Read時,可以避免不可重復讀。當singo拿著工資卡去消費時,一旦系統開始讀取工資卡信息(即事務開始),singo的老婆就不可能對該記錄進行修改,也就是singo的老婆不能在此時進行轉賬。

      雖然RepeatableRead避免了不可重復讀,但還有可能出現幻讀。

      Singo的老婆工作在銀行部門,她時常通過銀行內部系統查看singo的消費記錄。有一天,她正在查詢到singo當月信用卡的總消費金額(select sum(accout) from transaction where moth=本月)為80元,而singo此時正好在外邊胡吃海喝在收銀臺買單,消費1000元,即新增一條1000元的消費記錄(insert transaction …),并提交了事務。隨后singo的老婆將singo當月信用卡消費的明細打印到A4紙上,卻發小消費金額為1080元,singo的老婆發現很詫異,以為出現了幻覺,幻讀就這樣產生了。

注:MySql的默認隔離級別就是RepeatableRead。

3.4) Serializable

       Serializable是最高的事務隔離級別,同時代價也花費最高,性能很低,一般很少使用。在該級別下,事務順序執行。不僅避免了臟讀、不可重復讀、還避免了幻讀。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 三门县| 桐乡市| 临汾市| 平湖市| 阿鲁科尔沁旗| 溧水县| 顺义区| 威信县| 舟曲县| 淮南市| 文山县| 东兴市| 吐鲁番市| 乐业县| 曲麻莱县| 称多县| 嘉祥县| 衡东县| 济源市| 开化县| 康保县| 腾冲县| 界首市| 于田县| 鹰潭市| 离岛区| 胶州市| 武胜县| 改则县| 吉林省| 三河市| 安图县| 桦川县| 南通市| 清徐县| 昌都县| 滁州市| 廉江市| 通州区| 阿拉善盟| 大悟县|