MySql innoDB自动增量锁解决方案

MySql innoDB自动增量锁解决方案,mysql,multithreading,innodb,Mysql,Multithreading,Innodb,我有一个项目,在这个项目中,我用每秒自动递增的主键向一个表中插入了很多if info,并用多线程来完成,这意味着有许多线程试图向该表插入新行。因为表上有一个用于插入查询的锁,所以我不能同时执行插入,因此我无法从线程中获得最大性能 是否有克服此锁定的方法?您可以在my.cnf中将innodb\u autoinc\u lock\u模式设置为1。那么就没有自动增量的锁了。如果其中一个Thead回滚一个see示例,则值中可能存在漏洞 MariaDB [test]> show variables l

我有一个项目,在这个项目中,我用每秒自动递增的主键向一个表中插入了很多if info,并用多线程来完成,这意味着有许多线程试图向该表插入新行。因为表上有一个用于插入查询的锁,所以我不能同时执行插入,因此我无法从线程中获得最大性能


是否有克服此锁定的方法?

您可以在my.cnf中将innodb\u autoinc\u lock\u模式设置为1。那么就没有自动增量的锁了。如果其中一个Thead回滚一个see示例,则值中可能存在漏洞

MariaDB [test]> show variables like 'innodb_autoinc_lock_mode';
+--------------------------+-------+
| Variable_name            | Value |
+--------------------------+-------+
| innodb_autoinc_lock_mode | 1     |
+--------------------------+-------+
1 row in set (0.00 sec)
样本1

MariaDB [test]> start transaction;
Query OK, 0 rows affected (0.00 sec)

MariaDB [test]> insert into autoinc VALUES(NULL,'hello');
Query OK, 1 row affected (0.01 sec)



thread 2 ------------------>    MariaDB [test]> start transaction;
thread 2 ------------------>    Query OK, 0 rows affected (0.00 sec)

thread 2 ------------------>    MariaDB [test]> insert into autoinc VALUES(NULL,'world');
thread 2 ------------------>    Query OK, 1 row affected (0.00 sec)

thread 2 ------------------>    MariaDB [test]> commit;
thread 2 ------------------>    Query OK, 0 rows affected (0.00 sec)

thread 2 ------------------>    MariaDB [test]>


MariaDB [test]> commit;
Query OK, 0 rows affected (0.00 sec)

MariaDB [test]> select * from autoinc;
+----+-------+
| id | d     |
+----+-------+
|  1 | hello |
|  2 | world |
+----+-------+
2 rows in set (0.00 sec)

MariaDB [test]>
带回滚的示例2

MariaDB [test]> start transaction;
Query OK, 0 rows affected (0.00 sec)

MariaDB [test]> insert into autoinc VALUES(NULL,'Guten');
Query OK, 1 row affected (0.00 sec)

thread 2 ------------------>    MariaDB [test]> start transaction;
thread 2 ------------------>    Query OK, 0 rows affected (0.00 sec)

thread 2 ------------------>    MariaDB [test]> insert into autoinc VALUES(NULL,'Tag');
thread 2 ------------------>    Query OK, 1 row affected (0.00 sec)

thread 2 ------------------>    MariaDB [test]> commit;
thread 2 ------------------>    Query OK, 0 rows affected (0.01 sec)

MariaDB [test]> rollback;
Query OK, 0 rows affected (0.00 sec)

MariaDB [test]> select * from autoinc;
+----+-------+
| id | d     |
+----+-------+
|  1 | hello |
|  2 | world |
|  4 | Tag   |
+----+-------+
3 rows in set (0.00 sec)

MariaDB [test]>

但是如果我确信一旦我插入一行,我就不想回滚,除非发生db故障,我认为这不会经常发生,那么将锁设置为1并不是很坏的做法,我可以假设孔的数量将非常少,对吗,但是首先看看什么显示变量,比如“innodb_autoinc_lock_mode”;说。默认值为1。请看:我会的,但我知道有一个锁,因为当我尝试插入cunncortly时,我得到一个Sql异常,它说无法获取锁…您使用的是哪个DB版本,您能给我一个错误号吗?我使用的是mysql 5.7,错误是com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException:尝试获取锁时发现死锁;尝试重新启动事务。平均每秒插入多少次?最大限度您多久会遇到一次锁定问题?