0

看起来我对 SQL 数据库的工作原理缺乏一些基本的了解,特别是 MySQL。(编辑:现在我正在使用 InnoDB 引擎。)我在一个用纯 Groovy(没有 Grails)编写的程序中有一个线程,它CREATE TABLE使用. 我的问题是,在这个调用返回后,我可以立即从另一个线程访问这个表,还是取决于运气?我是否必须调用例如,或者我必须首先从创建线程访问表,然后逻辑上必须创建它?groovy.sql.SqlJDBCsql.close()

我知道,例如,如果我有一笔交易,那么该声明可能不会立即生效……或者我认为。即使我没有显式创建事务,谁知道 Groovy 或 JDBC 是否会为我创建一个事务。如果我使用的是 Hibernate 或其他一些框架,它也可以做任何它认为最佳的事情。我的印象是,即使sqlalchemy在 python 中也可能会做一些这种优化,除非我告诉它不要这样做。同样,如果 MySQL 本身以某种方式缓存我的语句以供将来执行、性能优化,而不是立即执行呢?

是否有任何正式的规则或原则,例如 ACID,让我有一定的把握?我如何知道 SQL 语句何时完成以便我可以使用它的结果?当然,这同样适用于其他语言和数据库类型。

4

1 回答 1

2

是的,您可以在创建表后立即使用它,但有一些条件。

如果您在同一事务中执行此操作,则没有限制。

如果您在单独的线程中执行此操作,则必须满足两个条件:

  • 使用的事务CREATE TABLE必须提交。
  • 尝试使用新表的线程必须在提交第一个事务启动另一个事务。

您可以通过始终使用CREATE TABLE IF NOT EXISTS.

于 2013-10-12T21:09:04.287 回答