mysql與事務

什么是事務
事務是作為一個邏輯單元執(zhí)行的一系列操作,一個邏輯工作單元必須有四個屬性,稱為 ACID(原子性、一致性、隔離性和持久性)屬性,只有這樣才能成為一個事務
一、事務的特性(ACID
原子性(Atomicity)
一組操作·要么全成功,要么全失敗。
一致性(Consistency)
保證數(shù)據(jù)的正確性,合理性,完整性。事務在完成時,必須使所有的數(shù)據(jù)都保持一致狀態(tài)
例如,在一次轉賬過程中,從某一賬戶中扣除的金額必須與另一賬戶中存入的金額相等。
隔離性(Isolation)
一個會話不能修改另一個用戶修改了但未提交的數(shù)據(jù)。
持久性(Durability)
一個事物一旦提交,數(shù)據(jù)庫的數(shù)據(jù)所發(fā)生的變化是永久的。
二、事務的隔離級別
一般數(shù)據(jù)庫中,有四種隔離級別
mysql與事務
mysql與事務
如上圖,四種隔離級別分別實現(xiàn)了不同的功能,看是級別越高也代表著需要的鎖越多,更容易產(chǎn)生阻塞。

接下來通過實驗介紹這幾種讀
(1)臟讀
把隔離級別調為READ-UNCOMMITTED
root@localhost:MySQL.sock  01:30:05 [(none)]>set global tx_isolation = 'READ-UNCOMMITTED';
root@localhost:mysql.sock  01:30:22 [(none)]>show global variables like '%iso%';
+---------------+------------------+
| Variable_name | Value            |
+---------------+------------------+
| tx_isolation  | READ-UNCOMMITTED |
+---------------+------------------+
1 row in set (0.00 sec)
會話1:
root@localhost:mysql.sock  01:34:06 [lala]>select * from score;
Empty set (0.00 sec)
root@localhost:mysql.sock  01:34:53 [lala]>begin;
Query OK, 0 rows affected (0.00 sec)
root@localhost:mysql.sock  01:35:23 [lala]>insert into score values(1,'xiaohong',99);
Query OK, 1 row affected (0.00 sec)
還沒有提交
會話2:
root@localhost:mysql.sock  01:37:08 [lala]>select * from score;
+------+----------+-------+
| id   | name     | score |
+------+----------+-------+
|    1 | xiaohong |    99 |
+------+----------+-------+
1 row in set (0.00 sec)
會話2可以直接讀到會話1還沒有提交的數(shù)據(jù)。
(2)不可重復讀
root@localhost:mysql.sock  01:30:05 [(none)]>set global tx_isolation = 'READ-COMMITTED';
root@localhost:mysql.sock  01:30:22 [(none)]>show global variables like '%iso%';
+---------------+------------------+
| Variable_name | Value            |
+---------------+------------------+
| tx_isolation  | READ-COMMITTED |
+---------------+------------------+
1 row in set (0.00 sec)
會話1:
root@localhost:mysql.sock  01:49:00 [lala]>begin;
Query OK, 0 rows affected (0.00 sec)

root@localhost:mysql.sock  01:49:08 [lala]>update score set id=3;
Query OK, 1 row affected (0.00 sec)

會話2:
root@localhost:mysql.sock  01:49:14 [lala]>select * from score;
+------+----------+-------+
| id   | name     | score |
+------+----------+-------+
|    1 | xiaohong |    99 |
+------+----------+-------+
1 row in set (0.00 sec)
會話1:
root@localhost:mysql.sock  01:49:20 [lala]>commit;
Query OK, 0 rows affected (0.00 sec)
會話2:
root@localhost:mysql.sock  01:49:47 [lala]>select * from score;
+------+----------+-------+
| id   | name     | score |
+------+----------+-------+
|    3 | xiaohong |    99 |
+------+----------+-------+
1 row in set (0.00 sec)
會話2第一次只讀到id的值是1,但以為會話1提交,會話2第二次讀到id的值是3.
(3)幻讀
會話1:
root@localhost:mysql.sock  01:49:00 [lala]>begin;
Query OK, 0 rows affected (0.00 sec)

root@localhost:mysql.sock  01:49:08 [lala]>insert into score values(2,'xiaoming',65);
Query OK, 1 row affected (0.00 sec)

會話2:
root@localhost:mysql.sock  01:49:14 [lala]>select * from score;
+------+----------+-------+
| id   | name     | score |
+------+----------+-------+
|    1 | xiaohong |    99 |
+------+----------+-------+
1 row in set (0.00 sec)
會話1:
root@localhost:mysql.sock  01:49:20 [lala]>commit;
Query OK, 0 rows affected (0.00 sec)
會話2:
root@localhost:mysql.sock  01:50:27 [lala]>select * from score;
+------+----------+-------+
| id   | name     | score |
+------+----------+-------+
|    3 | xiaohong |    99 |
|    2 | xiaoming |    65 |
+------+----------+-------+
2 rows in set (0.00 sec)
會話2第一次只讀到1條數(shù)據(jù),但以為會話1提交,會話2第二次讀到兩條記錄

ps:不可重復讀是因為數(shù)據(jù)的update導致,而幻讀是因為數(shù)據(jù)的delete或者insert導致

三、mysql中的事務
mysql默認開啟事務自動提交,即每執(zhí)行完一條sql語句自動提交一次。
那怎么禁用事務自動提交呢?如下:
session級別:
set autocommit=off;
局級別:
方法一:set global init_connect='set autocommit=0';
方法二:修改參數(shù)文件my.cnf
               [mysqld]
               init_connect='set autocommit=0';
方法三:  啟動mysql服務時,加上參數(shù) -init_connect='set autocommit=0';
也可以通過begin開啟一個事務,再通過commit提交;
mysql的默認隔離級別
mysql中的innodb的事務默認隔離級別是Repeatable read(可重復讀),但是它不是普通的Repeatable read,它在可重復讀的基礎上避免了幻讀。是通過臭名昭著的gop鎖實現(xiàn)不可重復讀。
myql通過tx_isolation決定事務隔離級別 ,可以查看當前的參數(shù)
root@localhost:mysql.sock  01:17:04 [(none)]>show global variables like '%iso%';
+---------------+----------------+
| Variable_name | Value          |
+---------------+----------------+
| tx_isolation  | REPEATABLE-READ |
+---------------+----------------+
1 row in set (0.00 sec)
所以要想修改mysql的事務隔離級別,直接修改這個參數(shù)就行了。

新聞標題:mysql與事務
瀏覽地址:http://m.kartarina.com/article28/pihsjp.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站排名網(wǎng)站維護網(wǎng)站設計做網(wǎng)站營銷型網(wǎng)站建設網(wǎng)站設計公司

廣告

聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站建設
主站蜘蛛池模板: 无码人妻精品一区二区三| 国产免费午夜a无码v视频| 国产精品三级在线观看无码| 欧美性生交xxxxx无码影院∵| 无码丰满少妇2在线观看| 久久AV高潮AV无码AV| 亚洲AV无码精品国产成人| 伊人蕉久中文字幕无码专区| 无码人妻精品一区二区三 | 国产精品ⅴ无码大片在线看| 精品无码国产污污污免费网站 | 一本一道VS无码中文字幕| 超清无码无卡中文字幕| 中文字幕亚洲精品无码| 国产拍拍拍无码视频免费| 亚洲AV无码片一区二区三区| 亚洲VA成无码人在线观看天堂| 久久久久亚洲AV无码去区首| 无码专区狠狠躁躁天天躁| 无码人妻久久一区二区三区免费| 人妻av中文字幕无码专区| 久久av无码专区亚洲av桃花岛 | 亚洲VA中文字幕无码毛片| 国产精品无码制服丝袜| 亚洲日韩AV无码一区二区三区人| 国产色爽免费无码视频| 亚洲AV无码一区二三区| 亚洲欧洲无码一区二区三区| 无码无遮挡又大又爽又黄的视频 | 一本大道无码人妻精品专区 | 亚洲Av综合色区无码专区桃色| 国产午夜无码福利在线看网站 | 日韩一区二区三区无码影院| 精品无人区无码乱码大片国产| 无码国产成人午夜电影在线观看| 内射无码专区久久亚洲| 精品久久久无码中字| 精品人妻无码一区二区色欲产成人| 久久久久亚洲AV无码观看| 白嫩少妇激情无码| 精品人妻无码区二区三区|