Mysql 自动提交

进入到新的一家公司后, 发现大家在mysql客户端上执行sql都不写commit,大家都习惯了这种写法,有一天来了另外一个DBA,环境变了,一早上update一个sql,大家发现怎么表被锁住了呢?

后天一发现,新的DBA,把[b]autocommit[/b]给关掉了,查看的sql如下:


show variables like 'autocommit';


输出结果如下;


autocommit OFF


这样的后果有三种:

1.[b] 如果是自己update一条语句后没有提交,再select同样的记录,那么会被锁住[/b]。

因为在同一个session里,如果update没有提交,再select同样的记录,这样记录会被锁住。

2.[b] 如果是自己update一条语句后没有提交,其它人select会发现旧的记录。[/b]
不在同一个session里,别人select的结果是旧的值,这个与事务的隔离级别有关系。

查看事务的隔离级别的命令如下:


select @@global.tx_isolation,@@tx_isolation;


3. [b]如果是自己update一条语句后没有提交,有它人update同记录会被锁住。[/b]

这个与在同一个session里的select情况是一样的。

之前在Oracle工作,一直都是坚持在update语句后commit,个人还是觉得这种习惯好。
<think>好的,我现在需要帮助用户了解MySQL自动提交机制,特别是默认设置及其行为。首先,我应该回顾用户提供的引用内容,看看里面有哪些关键点。 根据引用[1],MySQLautocommit默认是开启的,这样每次DML操作都会自动提交,可能会影响性能,比如插入1000条数据会提交1000次。但用户提到生产环境可能建议关闭,以防止手动操作失误。不过引用[2]提到,即使数据库设置为关闭,连接池可能默认开启,而显式事务会关闭autocommit。引用[3]和[4]似乎是一些重复的内容,可能没有太多新信息。引用[5]的链接可能涉及到Spring的配置,但用户主要关注的是MySQL本身。 接下来,我需要整理这些信息,确保回答结构清晰。首先说明默认设置是开启的,然后描述其行为:每个DML语句作为一个事务自动提交。接着讨论性能影响,比如频繁提交的开销。然后比较关闭autocommit的情况,手动控制事务可以提升性能,但需要注意正确使用事务边界,避免长事务和锁的问题。 另外,用户可能想知道如何查看和修改autocommit的设置。根据引用中的内容,可以通过SHOW VARIABLES和SET命令来操作,但生产环境需要谨慎,因为连接池可能有自己的配置,比如引用[2]提到JDBC连接池默认开启,且代码中的显式事务会覆盖设置。 需要注意区分数据库级别和会话级别的设置,以及不同客户端或框架的影响。比如Spring可能通过配置来管理autocommit,如引用[4]中的代码可能涉及物理连接的初始化,可能设置autocommit。 最后,用户可能需要知道最佳实践,比如在需要批量操作时关闭autocommit,使用显式事务,而默认保持开启以确保数据安全。同时,引用[1]提醒不要随意更改默认设置,除非明确了解影响。 现在要确保回答涵盖这些点,并正确引用来源。同时生成相关问题,比如如何修改autocommit、性能优化方法、与事务的关系等。</think>### MySQL自动提交(autocommit)机制详解 #### 1. 默认设置 MySQL自动提交模式默认处于**开启状态**($autocommit=1$),这意味着: - 每条数据操作语句(DML,如INSERT/UPDATE/DELETE)会立即作为独立事务提交 - 无需显式执行`COMMIT`命令即可持久化修改[^1][^2] #### 2. 核心行为特征 $$ \text{事务持续时间} = \begin{cases} \text{单条语句} & \text{当 } autocommit=1 \\ \text{手动控制} & \text{当 } autocommit=0 \end{cases} $$ - **开启时**:每条SQL语句自动包装为独立事务,如插入1000条数据会产生1000次提交操作 - **关闭时**:需通过`START TRANSACTION`显式开启事务,使用`COMMIT`或`ROLLBACK`结束事务 #### 3. 性能影响对比 | 模式 | 事务次数 | 锁持有时间 | I/O压力 | 数据安全性 | |------|----------|------------|---------|------------| | ON | 高频 | 短 | 高 | 高 | | OFF | 低频 | 长 | 低 | 需人工控制 | #### 4. 配置查看与修改 ```sql -- 查看当前设置 SHOW VARIABLES LIKE 'autocommit'; -- 输出示例:autocommit | ON -- 会话级修改(立即生效) SET autocommit = 0; -- 关闭自动提交 SET autocommit = 1; -- 开启自动提交 -- 全局修改(需重启生效) SET GLOBAL autocommit = 0; ``` #### 5. 注意事项 - **连接池影响**:JDBC连接池默认保持自动提交开启 - **框架交互**:Spring等框架在显式事务中会自动禁用autocommit[^4] - **生产建议**:保持默认开启,仅在批量操作时临时关闭并手动控制事务
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值