1. 程式人生 > 其它 >MySql MVCC是如何實現的-關於autocommit?

MySql MVCC是如何實現的-關於autocommit?

關於autocommit

  • 檢視autocommit
show variables like 'autocommit';

mysql> show variables like 'autocommit';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit | ON |
+---------------+-------+
1 row in set (0.00 sec)
我們可以看到autocommit的值為ON,說明MySql預設是開啟了自動提交事務的。什麼意思呢?我們舉例說明一下:

  1. 新建表
CREATE TABLE `keyvalue` (
  `key` int(11) NOT NULL AUTO_INCREMENT,
  `value` int(11) DEFAULT NULL,
  PRIMARY KEY (`key`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
  1. 在終端1中插入一條資料
insert into keyvalue(`value`)values(3);

3.在終端2中查詢,這時候是可以查詢到的

select * from keyvalue where `value`=3;

4.修改autocommit為OFF

set session autocommit=0;

5.重新執行2-3步驟,這時候的終端2中是查不到終端1中插入的資料的,也就是終端1中插入的資料對終端2不可見。

6.在終端1中提交事務,再次在終端2中檢視,這時候就可以檢視到了。

7.總結:
1.當autocommit為ON狀態時,即使沒有手動start transaction開啟事務,mysql預設也會將使用者的操作當做事務即時提交。
2.當autocommit為OFF狀態時,mysql仍然會自動開啟事務,但是需要使用者手動提交,未提交前,A事務對資料庫做的修改對B事務是不可見的。

8.思考:當autocommit為ON狀態時,使用者手動開啟事務,mysql會不會自動提交?
答案是:不會

我們測試一下,先將autocommit設定為ON,然後在終端1手動開啟一個事務,在終端2中查詢,從結果來看,在未手動提交前,終端2中是檢視不到的。

牛人之所以是牛人,是因為你現在在踩的坑,他曾經都已經踩過了。