This is a bit surprise when we encountered a case where InnoDB is not releasing its row lock when there is an error condition within the transaction. And I verified with Falcon, Oracle, SQL Server and Sybase; all seemed to work as expected.
For example; just open a transaction in a session and execute a error statement (lets say duplicate key) and on the other new session try to get a row lock on the same record (use where clause with FOR UPDATE) and you will notice that InnoDB blocks on this statement until you issue a explicit rollback or commit. But remember there is nothing happened on the first session other than duplicate error on that row. So, InnoDB should implicitly unlock the row when there is an error; and looks like it is not doing that.
Here is the scenario:
First create a single column table and populate some rows (lets say 20 rows in this case) on any version of MySQL/InnoDB.
mysql> create table t1(c1 int not null auto_increment primary key)Engine=InnoDB; Query OK, 0 rows affected (0.14 sec) mysql> insert into t1 values(),(),(),(),(),(),(),(),(),(); Query OK, 10 rows affected (0.12 sec) Records: 10 Duplicates: 0 Warnings: 0 mysql> insert into t1 values(),(),(),(),(),(),(),(),(),(); Query OK, 10 rows affected (0.01 sec) Records: 10 Duplicates: 0 Warnings: 0
and then execute the following statements; first in session-I and then in session-II and notice that session-II select statement hangs till you explicitly release the transaction in session-I.
| Session-I | Session-II |
mysql> begin; Query OK, 0 rows affected (0.00 sec) mysql> insert into t1 values(10); ERROR 1062 (23000): Duplicate entry ‘10′ for key ‘PRIMARY’ |
mysql> begin; Query OK, 0 rows affected (0.00 sec) mysql> select * from t1 where c1=10 for update; |
Even though am not really sure whether this is a bug or feature in InnoDB (I suspect this as a bug); but Oracle, SQL Server or Sybase will not block the select and releases the lock on the duplicate error. Even Falcon engine in MySQL 6.0 does seem to release the lock appropriately.
Here is a quick comparison of the new InnoDB plugin performance between different compression, row formats that is introduced recently.
The table is a pretty simple one:
CREATE TABLE `sbtest` ( `id` int(10) unsigned NOT NULL, `k` int(10) unsigned NOT NULL DEFAULT ‘0′, `c` char(120) NOT NULL DEFAULT ”, `pad` char(60) NOT NULL DEFAULT ”, PRIMARY KEY (`id`), KEY `k` (`k`) ) ENGINE=InnoDB ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8;
The table is populated with 10M rows with average row length being 224 bytes. The tests are performed for Compact, Dynamic and Compressed (8K and 4K) row formats using MySQL-5.1.24 with InnoDB plugin-1.0.0-5.1 on Dell PE2950 1x Xeon quad core with 16G RAM, RAID-10 with RHEL-4 64-bit.
Here are the four test scenarios:
All the above tests are repeated with innodb_buffer_pool_size=6G and 512M to make sure one fits everything in memory and another one overflows. The rest of the InnoDB settings are all default except that innodb_thread_concurrency=32.
Here is the summary of the test results:
Table Load:
Load time from a dump of SQL script having 10M rows (not batched)
| Compact | Compressed (8K) | Compressed (4K) | Dynamic |
| 28m 18s | 29m 46s | 36m 43s | 27m 55s |
File Sizes:
Here is the size of the .ibd file after each data load
| Compact | Compressed (8K) | Compressed (4K) | Dynamic |
| 2.3G | 1.2G | 592M | 2.3G |
Data and Index Size from Table Status:
Here is the Data and Index size in bytes from SHOW TABLE STATUS and you can see the original data size here rather than the compressed size
| Compact | Compressed (8K) | Compressed (4K) | Dynamic | |
| Data | 2247098368 | 2247098368 | 2249195520 | 2247098368 |
| Index | 137019392 | 137035776 | 160301056 | 137019392 |
Compression Stats:
Here is the compression stats after the table is populated from information_schema.InnoDB_cmp; and you notice that 4K takes more operations and time for both compression and un-compression
| Page_size | Compress_ops | Compress_ops_ok | Compress_time | Uncompress_ops | Uncompress_time | |
| 8K | 8192 | 446198 | 445598 | 73 | 300 | 0 |
| 4K | 4096 | 1091421 | 1012917 | 463 | 38801 | 13 |
Performance:
Here is the performance of various row formats with threads ranging from 1-512 for both 512M and 6G buffer pool size for both concurrent reads and writes.
Observations:
Few key observations from the performance tests that I performed without looking to any of the sources, as I could be wrong, someone can correct me here. Its hard to draw from these input scenarios, but helps to estimate what is what.
Here is the quick notes from the session Falcon from the beginning by Jim Starkey and Ann Harrison