SQL语句是否立即执行?

时间:2013-10-12 21:00:22

标签: mysql sql jdbc concurrency groovy

看起来我对SQL数据库的工作方式缺乏基本的了解,特别是MySQL。 (编辑:目前我正在使用InnoDB引擎。)我在一个用纯Groovy(没有Grails)编写的程序中有一个线程使用CREATE TABLE执行groovy.sql.Sql应该是JDBC的包装器。我的问题是,在此调用返回后,我可以立即从另一个线程访问此表,还是依赖运气?我是否必须致电,例如sql.close()或者我是否必须首先从创建线程访问该表,因为逻辑上必须创建它?

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

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

1 个答案:

答案 0 :(得分:2)

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

如果您在同一笔交易中执行此操作,则没有任何限制。

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

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

您可以通过始终使用CREATE TABLE IF NOT EXISTS来缓解此问题。