看起来我对SQL数据库的工作方式缺乏基本的了解,特别是MySQL。 (编辑:目前我正在使用InnoDB引擎。)我在一个用纯Groovy(没有Grails)编写的程序中有一个线程使用CREATE TABLE
执行groovy.sql.Sql
应该是JDBC
的包装器。我的问题是,在此调用返回后,我可以立即从另一个线程访问此表,还是依赖运气?我是否必须致电,例如sql.close()
或者我是否必须首先从创建线程访问该表,因为逻辑上必须创建它?
我知道,例如,如果我有一个交易,那么该声明可能不会立即生效......或者我认为。即使我没有明确地创建事务,谁知道Groovy或JDBC是否会为我创建一个。如果我正在使用Hibernate或其他框架,它也可以做任何它认为最佳的事情。我的印象是,即使sqlalchemy
在python中也可以做一些这种优化,除非我告诉它不要。同样,如果MySQL本身以某种方式缓存我的语句以供将来执行,进行性能优化而不立即执行它会怎样?
是否有任何正式的规则或原则如ACID让我有一定的确定性?我怎么知道SQL语句什么时候完成所以我可以使用它的结果?当然,同样适用于其他语言和数据库类型。
答案 0 :(得分:2)
是的,您可以在创建表后立即使用表,但有一些条件。
如果您在同一笔交易中执行此操作,则没有任何限制。
如果您在单独的线程中执行此操作,则必须满足两个条件:
CREATE TABLE
的交易必须提交。您可以通过始终使用CREATE TABLE IF NOT EXISTS
来缓解此问题。