Mysql SQL语句是否立即执行?
看起来我对SQL数据库的工作原理缺乏一些基本的了解,特别是MySQL。(Edit:目前我正在使用InnoDB引擎。)我在一个纯Groovy(无Grails)编写的程序中有一个线程,它使用Mysql SQL语句是否立即执行?,mysql,sql,jdbc,concurrency,groovy,Mysql,Sql,Jdbc,Concurrency,Groovy,看起来我对SQL数据库的工作原理缺乏一些基本的了解,特别是MySQL。(Edit:目前我正在使用InnoDB引擎。)我在一个纯Groovy(无Grails)编写的程序中有一个线程,它使用Groovy.sql.sql创建表,这应该是JDBC的包装器。我的问题是,在这个调用返回后,我是否可以立即从另一个线程访问这个表,还是这取决于运气?我是否必须调用例如sql.close(),或者我必须首先从创建线程访问该表,因为在逻辑上必须创建该表 我知道,例如,如果我有一笔交易,那么该声明可能不会立即生效。。。
Groovy.sql.sql
创建表,这应该是JDBC
的包装器。我的问题是,在这个调用返回后,我是否可以立即从另一个线程访问这个表,还是这取决于运气?我是否必须调用例如sql.close()
,或者我必须首先从创建线程访问该表,因为在逻辑上必须创建该表
我知道,例如,如果我有一笔交易,那么该声明可能不会立即生效。。。我想大概是这样。即使我没有显式地创建事务,谁知道Groovy或JDBC是否会为我创建事务呢。如果我使用Hibernate或其他框架,它也可以做任何它认为最佳的事情。我的印象是,即使是python中的sqlalchemy
也可能会进行此类优化,除非我告诉它不要这样做。类似地,如果MySQL本身以某种方式缓存我的语句以备将来执行、性能优化,而不是立即执行,该怎么办
是否有任何正式的规则或原则,如ACID,让我有一些确定性?如何知道SQL语句何时完成,以便使用其结果?当然,这同样适用于其他语言和数据库类型。是的,您可以在创建表后立即使用它,但有一些条件
如果您在同一事务中执行此操作,则没有限制
如果在单独的线程中执行此操作,则必须满足两个条件:
- 使用
创建表的事务必须提交
- 尝试使用新表的线程必须在提交第一个事务后启动另一个事务
您可以通过始终使用CREATE TABLE IF NOT EXISTS
来缓解此问题。您使用的是InnoDB引擎吗?@mvp:Yes。答案有关系吗?有关系,因为InnoDB完全是事务性的(不像MyISAM)。简短的回答是:是的,这取决于运气。如果另一个线程在您的事务尚未完成时调用,它将不会看到新表。实际上,在线创建表格不是最佳实践之一,你确定需要这样做吗?@Ashalynd:不,我可以避免。等等,让我先读。。。不过,我怎么知道我的交易已经完成,这样我就可以告诉另一个线程继续?谢谢!1.是否保证不同的线程使用不同的连接,因此不在同一事务中?2.如果使用groovy.sql,我如何知道事务是否/何时提交?哪个是JDBC的包装器,哪个是sql的包装器?我可能需要了解这两种方法是如何工作的,不是吗?3.当我显式提交事务并在提交返回后提交时,是否意味着我现在100%安全?1。它不是,这取决于你的应用程序。通常情况下,你想拥有。3.是的,如果事务提交,并且只有在您启动另一个事务后,您才是安全的。太好了。。。我会读更多关于这个主题的文章。看起来JDBC在默认情况下保持自动提交模式:。顺便问一下,您是如何在评论中插入链接的?请使用此链接:[text](url)