我想知道是否有可能在一个事务中运行多个DDL语句。 我对SQL Server特别感兴趣,即使与其他数据库(Oracle,至lessPostgreSQL)的答案也可能是有趣的。 我已经做了一些“创build表”和“创build视图”的交易内创build的表,似乎有一些不一致,我想知道如果不应该在交易内完成DDL … 我大概可以将DDL移到事务之外,但是我想为此得到一些参考。 我发现了这么多: MSDN页面数据库引擎中的隔离级别清楚地表明,在快照隔离下正在运行的显式事务中,可以执行哪些DDL操作是有限制的 – 但是我没有使用快照隔离,这应该导致错误。 这可以被解释,以便DDL操作可以在不同隔离级别下的显式事务中执行。 用于SQL Server的Oracle®数据库网关用户指南#DDL语句声明 在给定的事务中只能执行一个DDL语句 – 对于直接使用的SQL Server是否也有效? 对于Oracle: 在SO问题中unit testingDDL语句需要在一个事务中 ,据说Oracle对DDL语句做了隐式提交? (即使没有参考) 如果有关系,我通过JTDS JDBC驱动程序来处理Java。 Touko
他们是立即回滚? 他们在一段时间后回滚了吗? 他们是否处于未提交状态? 如果使用连接池并且连接重置简单,行为是否相同?
在下面的设置中,方法B在(新)事务中运行吗? 一个EJB,有两种方法,方法A和方法B. public class MyEJB implements SessionBean public void methodA() { doImportantStuff(); methodB(); doMoreImportantStuff(); } public void methodB() { doDatabaseThing(); } } EJB是容器pipe理的,methodB在requires_new事务中,方法A在所需的事务中。 从而: <container-transaction id="MethodTransaction_1178709616940"> <method id="MethodElement_1178709616955"> <ejb-name>MyName</ejb-name> <method-name>*</method-name> <trans-attribute>Required</trans-attribute> </method> <method id="MethodElement_1178709616971"> <ejb-name>MyName</ejb-name> <method-name>methodB</method-name> </method> <trans-attribute>RequiresNew</trans-attribute> </container-transaction> 现在让另一个EJB调用methodA调用EJB方法。 methodA现在运行在一个事务中。 从methodA的后续调用methodB运行在同一个事务中,还是运行在一个新的事务? (请注意,这里是实际的代码,没有明确的方法B的ejb调用)
我正在寻找一种方法来确定在当前会话中是否存在uncommited INSERT,UPDATE或DELETE语句。 一种方法是使用当前的sid来检查v $ lock,但这需要对v $ lock进行读取访问,如果DBA不想授予它,那么这是一个问题。 除了跟踪应用程序发出的所有数据库命令外,还有其他的方式吗?
我正在收集有关flush()方法的信息,但是我不清楚何时使用它以及如何正确使用它。 从我读到的内容来看,我的理解是持久化上下文的内容将与数据库同步,即发出未完成的语句或刷新实体数据。 现在我有两个实体A和B (一对一的关系,但没有强制执行或由JPAbuild模)的以下情况。 A有一个手动设置的组合PK,还有一个自动生成的IDENTITY字段recordId 。 这个recordId应该写入实体B作为A一个外键。 我在一次交易中保存A和B 问题是自动生成的值A.recordId在事务中不可用,除非在A上调用em.persist()之后,明确调用em.flush() 。 (如果我有一个自动生成的IDENTITY PK,那么值直接在实体中更新,但这不是这种情况。) 在事务中使用em.flush()会造成什么危害?
我对事务与locking表有点混淆,以确保数据库的完整性,并确保SELECT和UPDATE保持同步,没有其他连接干扰它。 我需要: SELECT * FROM table WHERE (…) LIMIT 1 if (condition passes) { // Update row I got from the select UPDATE table SET column = "value" WHERE (…) … other logic (including INSERT some data) … } 我需要确保没有其他查询会干扰和执行相同的SELECT (在连接完成更新行之前读取“旧值”。 我知道我可以默认LOCK TABLES table ,以确保一次只有一个连接正在做这件事,当我完成时解锁它,但这似乎是矫枉过正。 在一个事务中包装会做同样的事情(确保没有其他连接尝试相同的过程,而另一个正在处理)? 或者将一个SELECT … FOR UPDATE或SELECT … LOCK IN SHARE MODE更好?
我正在构build一个Web应用程序,试图在App_Start上安装/升级数据库。 安装程序的一部分是确保数据库安装了asp.netfunction。 为此,我正在使用System.Web.Management.SqlServices对象。 我的意图是做一个SQL事务中的所有数据库工作,如果有任何失败,回滚事务并保持数据库不变。 SqlServices对象有一个方法“安装”,它需要一个ConnectionString而不是一个事务。 所以相反,我使用SqlServices.GenerateApplicationServicesScripts如下所示: string script = SqlServices.GenerateApplicationServicesScripts(true, SqlFeatures.All, _connection.Database); SqlHelper.ExecuteNonQuery(transaction, CommandType.Text, script, …); 然后使用企业库中的SqlHelper。 但是这会抛出一个exception与一个错误的对接,一些在下面 Incorrect syntax near 'GO'. Incorrect syntax near 'GO'. Incorrect syntax near 'GO'. Incorrect syntax near 'GO'. Incorrect syntax near the keyword 'USE'. Incorrect syntax near the keyword 'CREATE'. Incorrect syntax near 'GO'. The variable name '@cmd' has […]
有人可以通过真实世界的例子来解释@Transactional注释中的隔离和传播参数。 基本上什么时候和为什么我应该select改变他们的默认值。
如果在mysql命令列表中发生任何错误,是否可以自动回滚? 比如说: begin transaction; insert into myTable values1 … insert into myTable values2 …; — will throw an error commit; 现在,执行我希望整个事务失败,因此我不应该看到myTable中的values1。 但不幸的是,即使交易存在错误,表格也正在被价值化。 任何想法如何使它回滚? (再次,在任何错误)? 编辑 – 从DDL更改为标准的SQL
MySQL是否允许使用嵌套事务?