標籤:rem table 執行時間 實現原理 res engine 阻塞 pre com
1、測試過程如下:
CREATE TABLE `test` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(100) DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `name` (`name`)) ENGINE=InnoDB DEFAULT CHARSET=utf8
事務1: 事務2:
mysql> select * from test; +----+-------+| id | name |+----+-------+| 1 | name1 |+----+-------+1 row in set (0.00 sec) mysql> start transaction; start transaction;Query OK, 0 rows affected (0.00 sec)mysql> insert into test(name) values(‘name2‘);(成功)
insert into test(name) values(‘name3‘); (成功,和事務1之間沒有阻塞)
insert into test(name) values(‘name3‘);(失敗,因為和事務未commit的資料衝突了)
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
commit;
commit;
2、分析:對於unique的insert,如果不同事務之間存在非unqiue衝突,則事務會等待衝突的事務提交,也就是等待鎖。如果不存在衝突則能正在執行更新。
mysql的某一列為unique屬性時,會為該列建索引,所以該列不能太大。
因為大事務的執行時間較長,那麼別的事務如果衝突了等待鎖的事務也較長,那麼事務會因為鎖逾時而造成整個資料庫的輸送量的降低。對於小事務可以建unique。
MySql unique的實現原理簡析