MySQL是否有并发控制生成自增值?
Does MySQL has concurrent control on generating auto-increment value?
同事给我提供了一个模拟Oracle序列的代码段:
// generate ticket
pstmt = conn.prepareStatement( "insert seq_pkgid values (NULL);" );
if(pstmt.executeUpdate() > 1) {
success = 1;
} else {
throw new Exception("Generating seq_pkgid sequence failed!");
}
pstmt.close();
pstmt = null;
// get ticket
pstmt = conn.prepareStatement( "select last_insert_id() as maxid" );
rs = pstmt.executeQuery();
if( rs.next() ) {
nSeq = rs.getInt( "maxid" );
}
rs.close();
rs = null;
pstmt.close();
pstmt = null;
但我想知道如果此代码段大约同时从 2 个实例执行会怎样。他们会得到相同的生成的自动增量值吗? MySQL 是否有并发控制,例如critical section or semaphore, 生成新的自增值时?
如果您确实需要从数据库生成计数器,您可以在此处阅读如何使用 InnodDB 和锁定读取在 MySQL 上执行操作。
https://dev.mysql.com/doc/refman/5.7/en/innodb-locking-reads.html
购买 我想知道您是否真的需要一个自动增量字段或您想要存储的对象的唯一标识符;在这种情况下,也许 UUID() 就可以了:
https://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_uuid
是的!如果该列在列定义中具有 AUTO_INCREMENT,则 MySQL 将在该列上具有自动增量锁定。请参考
https://dev.mysql.com/doc/refman/5.7/en/innodb-auto-increment-handling.html
同事给我提供了一个模拟Oracle序列的代码段:
// generate ticket
pstmt = conn.prepareStatement( "insert seq_pkgid values (NULL);" );
if(pstmt.executeUpdate() > 1) {
success = 1;
} else {
throw new Exception("Generating seq_pkgid sequence failed!");
}
pstmt.close();
pstmt = null;
// get ticket
pstmt = conn.prepareStatement( "select last_insert_id() as maxid" );
rs = pstmt.executeQuery();
if( rs.next() ) {
nSeq = rs.getInt( "maxid" );
}
rs.close();
rs = null;
pstmt.close();
pstmt = null;
但我想知道如果此代码段大约同时从 2 个实例执行会怎样。他们会得到相同的生成的自动增量值吗? MySQL 是否有并发控制,例如critical section or semaphore, 生成新的自增值时?
如果您确实需要从数据库生成计数器,您可以在此处阅读如何使用 InnodDB 和锁定读取在 MySQL 上执行操作。
https://dev.mysql.com/doc/refman/5.7/en/innodb-locking-reads.html
购买 我想知道您是否真的需要一个自动增量字段或您想要存储的对象的唯一标识符;在这种情况下,也许 UUID() 就可以了:
https://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_uuid
是的!如果该列在列定义中具有 AUTO_INCREMENT,则 MySQL 将在该列上具有自动增量锁定。请参考 https://dev.mysql.com/doc/refman/5.7/en/innodb-auto-increment-handling.html