问题标签 [autocommit]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - 使用 Hibernate 和 MySQL 在运行时自动提交更改
我在 Glassfish 3.1.2.2 中运行的 Hibernate (3) 和 MySQL (5.5) 遇到了一个奇怪的问题,其中自动提交标志的状态在运行时在单个服务器调用的上下文中和相同的线程。我没有明确地改变它,它最近突然开始了。这方面的代码没有显着变化。
我正在使用的代码具有各种数据访问方法,每种方法都遵循相同的模式:
- 从 Hibernate 会话工厂获取当前会话
- 开始交易
- 执行更新
- 提交事务
- 第 3 步和第 4 步在 try/catch 中,如果出现异常,事务将回滚。
在前两次这样的方法调用中,自动更新标志为假(getDefaultSession().connection().getAutoCommit()
),但在第三次,以及之后的每一次,标志突然为真,没有说明它是如何/为什么改变的。如果标志为真,我不得不向某些方法添加解决方法代码以跳过提交,但这是一个最近才开始发生的问题,我不能去更新所有方法。
敲门声是自动提交标志在当前会话中肯定保存为 true,因为下次该线程 ID 获得会话时,状态开始为 true。如果下一次在该线程上使用的数据访问方法碰巧没有解决方法代码,则会引发异常并且状态恢复为 false。同样,我们没有明确的代码。
IE
- 线程 1,方法 1
- DAO 1:自动提交错误
- DAO 2:自动提交错误
- DAO 3:自动提交 true
- DAO ...n: 自动提交 true
- 线程 !1,方法自动提交 false
- 线程1,方法
- DAO x: 自动提交 true
- 例外
- DAO y: 自动提交 false
我发现了很多关于如何在 Hibernate 配置中启用/禁用自动提交的线程,并且我确实有配置项:
<property name="hibernate.connection.autocommit">false</property>
我还发现一些线程表明在使用多个线程时标志可能会更改为 true,但是所有这些方法(大约在更改发生时)都是从同一个初始方法和同一个线程中调用的(根据 ThreadID 确认)在 Glassfish 日志中)。
我已经阅读了 JDBC url 上的relax auto-commit 标志,但我更愿意深入了解它开始发生的原因。作为最后的手段,我可能不得不这样做以避免不得不更改我们所有的代码。
严重迷茫...
mysql - 共享环境中的 MYSQL AutoCommit
我正在使用我公司中许多人共享的服务器。服务器上有多个数据库,我不控制服务器。
系统管理员已将默认值设置为自动提交设置为 false。这在尝试使用 PHPMYADMIN 时给我带来了麻烦。
我可以安全地将自动提交设置为 true 而不影响服务器上的其他数据库吗?我认为是的,但如果我错了,后果可能会对其他用户产生负面影响。
spring - 事务退出前的 Spring 提交
我们正在尝试从 Spring 2.5.2 升级到 4.0.5.RELEASE,但发现 Spring 的事务管理不再起作用。
在我们的生产应用程序中,所有数据库操作都通过一个标有 @Transactional 注释(使用默认设置)的 Spring bean。几年来,这一直按预期工作,如果在事务边界内引发 RuntimeException,则会发生回滚。但是,当我们升级到 Spring 4.0.5.RELEASE 时,它的作用就像 autocommit 设置为 true。
通过查看堆栈跟踪,我们验证了问题代码仍在事务代理内部运行。但是当我们在进入事务后对表执行简单的一行更新时,更新是提交的。这令人费解,因为我们所做的只是更改 Spring 版本。
以后的 Spring 版本中自动提交行为是否发生了变化?在 4.05 下我们需要做一些额外的配置吗?
这是我们事务管理器的配置(在 2.52 和 4.05 版本中相同):
这是在我们的代码中具有@Transactional 方法的bean:
以下是我们如何创建应用程序上下文并获取事务 bean,然后将其保存为静态变量:
我们将该 bean 保存在一个静态变量中,并在我们执行事务时引用它。我们应该做一些不同的事情吗?
当我们想开始一个事务时,我们调用:
这是我们在 DataSourceExecutorBean 中调用以启动事务的方法。它基本上只是将其内部数据源传递给执行程序(实际执行数据库工作的代码)。
当我重新检查两个版本的日志时,我注意到 4.0.5(损坏的)版本有一些 2.5.2 版本没有的条目。这些条目在事务开始时出现:
2014-07-31 09:34:43,576 [btpool0-0] 调试 - 创建单例 bean 'efmsDataSource' 的共享实例 2014-07-31 09:34:43,576 [btpool0-0] 调试 - 创建 bean 'efmsDataSource' 的实例2014-07-31 09:34:43,576 [btpool0-0] 调试 - 急切地缓存 bean 'efmsDataSource' 以允许解析潜在的循环引用
也许这解释了正在发生的事情(但不是为什么)。看起来单例数据源 bean 并不是真正的单例。谷歌显示了一些有类似问题的人,但没有说明如何解决它。这会和任何人一起敲响警钟吗?
mysql - MySQL 用户定义函数是调用它们的语句的自动提交事务的一部分吗?
假设我有一些 InnoDB(或其他事务感知)表,以及MyFunction()
在计算其返回值的过程中从这些表读取或写入的用户定义函数。
进一步假设启用了自动提交(即 MySQL 以其默认方式运行)。
如果我发出(例如)声明:
所有表访问(包括显式更新以及some_table
任何读/写操作)都是单个事务的一部分吗?MyFunction()
或者
每个 DML 语句中的单个 DML 语句是否在MyFunction()
执行时自动提交......然后缓存的更改在some_table
此之后作为另一个单独的事务应用?
或者
……还有什么?
我已经通读了 MySQL 文档,但要么我遗漏了一些东西,要么在这个问题上并不清楚。它确实说,在 autocommit ON 的情况下,“一旦您执行更新(修改)表的语句,MySQL 就会将更新存储在磁盘上以使其永久化”。但是 (a) 只讨论修改,而不是 (例如) SELECT
s 的行锁定或隔离级别,以及 (b) 更重要的是,当用户定义的函数(可能在其中包含数据修改 DML 语句)从某个包含语句中调用。
MySQL专家可以澄清一下吗?谢谢。
jdbc - Acquiring Autocommit Disabled DB Connection
I would like to know if there is a way to say pass autocommit = false in "info" parameter to DriverManager.getConnection(String url, Properties info) and get db connection which shall have autocommit disabled by default. I know that I can get the connection and then invoke setAutocommit to false but would like to know if this is achievable.
mysql - useLocalSessionState 是做什么用的?
我遇到了 MySQL db 的问题,即使没有自动提交模式更改,也会多次记录 setAutocommit。例如,如果我调用 setautocommit(false) 5 次,我会在查询日志中看到 5 个查询说 set autommit=0;
这通常不应该发生,因为自动提交模式没有改变。仅当我更改自动提交模式时才应发送查询,即说 1 到 0。
当我查看 MySQL 连接类实现时,我发现他们检查 useLocalSessionState 值来决定是否要执行查询?
因此,即使 this.autocommit 和 autocommit 标志相同,也不会将 needsSetOnServer 设置为 false,因为 useLocalSessionState 默认为 false。
在我的连接 URL 中添加 useLocalSessionState = true 后,我看不到不必要的查询日志。
所以,我的问题是:
- useLocalSessionState 的意义是什么?为什么普遍使用?
- 设置 useLocalSessionState = true 是否安全?
PS:我看到 SQL Server 在没有任何此类依赖项的情况下处理这种情况,即(来自 SQLServerConnection 的代码片段
mysql - 镜像表:触发器、死锁和隐式提交
我有 2 个类似的表,例如 A 和 B。我想将 A 中的插入复制到 B,并将 B 中的插入复制到 A 以集成两个用户系统。我在每个上都配置了“插入触发器后”。例子:
如果我在 A 中插入,触发器会在 B 中调用插入,但是此插入会在 B 中执行触发器,并且会发生死锁,从而避免无限循环。
我尝试在执行 INSERT 之前编辑触发器以 DROP 另一个表触发器,然后在它之后再次创建它。例子:
但是,CREATE 是一种数据定义语言 (DDL) 语句,它会进行隐式提交。因此,这是无法做到的。
我试图用内部的 DROP 调用一个 PROCEDURE 来明确处理提交,但也不可能。
有什么建议可以镜像这两张桌子吗?
更新:使用Bill Karwin的 建议,我origin
向每个表添加了一个字段,其中包含各自的默认值A
或B
. 然后,我改变(DROP 和 reCREATE)触发器如下:
A中的触发:
在 B 中触发:
java - java sqlite自动提交慢
背景:我在 Netbeans 中使用 Java。
我正在从 CSV 文件中读取行并将它们插入到 SQLite 数据库中。我认为非常基本的东西。根据在本网站和其他地方找到的示例,我构建了以下代码。它有效,但我很惊讶它有多慢。将 46 行加载到 db 需要 3.95 秒!使用 Netbeans Profiler,我可以看到 autoCommit() 占用了大部分时间,3.7 秒。
我究竟做错了什么?或者,这只是使用 SQLite 而不是 MySQL 的惩罚吗?
}
postgresql - 将 postgreSQL 存储过程作为一个事务执行
我正在使用 PostgreSQL 9.3,并且创建了一些包含多个语句的存储过程。我在准备好的语句的帮助下在 Java 应用程序中调用这个存储过程。
现在我读到存储过程中的每条语句都作为事务执行,即每条语句后提交一次。但我想要的是让整个存储过程作为一个事务执行,即只有一个提交。
我怎样才能做到这一点?也许在 JDBC 级别停用自动提交?
spring - Spring jdbc事务未提交
我有以下 Spring 配置:
具有数据库和事务管理的 Bean 配置如下:
DocDaoImpl
类updateData
从接口实现方法DocDao
:
因为dataSource
已将 autocommit 选项设置为 false,所以我希望仅当两个 batchUpdates 操作都完成且没有错误时才会提交事务。不幸的是,除非两个更新都在没有错误的情况下完成,否则不会执行提交,并且我在数据库中看不到任何更改。怎么了 ?为什么@Transactional
注释不起作用并且未执行提交?