在Hibernate API中,有一个属性hibernate.connection.autocommit可以设置为true.

但在接口中,他们提到不建议这样设置:

为JDBC池连接启用自动提交(不是

为什么不推荐呢? 将此属性设置为true有什么不良影响?

推荐答案

所有数据库语句都在物理事务的上下文中执行,即使我们没有显式声明事务边界(BEGIN/COMMIT/ROLLBACK).

如果不声明事务边界,则必须在单独的事务中执行每条语句.这甚至可能导致每个语句打开和关闭一个连接.

将服务声明为@Transaction将为您提供整个事务持续时间的一个连接,并且所有语句都将使用该单个隔离连接.这比一开始就不使用显式事务要好得多.在大型应用程序中,您可能有许多并发请求,降低数据库连接获取请求率肯定会提高应用程序的整体性能.

所以经验法则是:

  1. 如果您的只读事务只执行一个查询,则可以为这些事务启用自动提交.

  2. 如果您的事务包含多条语句,则需要禁用自动提交,因为您希望所有操作都在单个工作单元中执行,并且不想给连接池带来额外压力.

Database相关问答推荐

[mongodb],如何通过聚合获得具有许多不同字段的文档的最大值?子字段名称相同

哪个能够存储 1 亿条记录的嵌入式数据库具有高效的 C 或 C++ API

数据库中的每个表都应该有一个 SQLiteOpenHelper 吗?

PostgreSQL 嵌套 INSERTs / WITHs 用于外键插入

Sql更新查询

授予对具有特定前缀的多个表的权限

在 postgresql 中将列从字符串更改为字符串数组

当使用多个 WHEN MATCHED 语句时,它们是全部执行,还是只执行一个?

使 H2 将引用的名称和未引用的名称视为相同

恢复数据库备份时出错

如何使用 PHP 代码将图像上传到 MySQL 数据库

多语言数据库,默认回退

在服务器上排序还是在客户端排序?

归档实时 MySQL 数据库的最佳方式

面向文档的数据库是否旨在取代关系数据库?

部分依赖(数据库)

Oracle:如何在 Oracle SQL 中将十六进制转换为十进制?

如何将sqlite表从磁盘数据库复制到python中的内存数据库?

如何在我的数据库中避免 NULL,同时还表示丢失的数据?

获取 xp_cmdshell 的执行权限