mysql是自动commit吗(详解MySQL与Spring的自动提交autocommit)
mysql是自动commit吗
详解MySQL与Spring的自动提交autocommit1 MySQL的autocommit设置
MySQL默认是开启自动提交的,即每一条DML(增删改)语句都会被作为一个单独的事务进行隐式提交。如果修改为关闭状态,则执行DML语句之后要手动提交 才能生效。
查询当前会话的自动提交是否开启:
|
mysql> show variables like 'autocommit' ; + ---------------+-------+ | Variable_name | Value | + ---------------+-------+ | autocommit | ON | + ---------------+-------+ |
查询全局的自动提交是否开启:
|
mysql> show global variables like 'autocommit' ; + ---------------+-------+ | Variable_name | Value | + ---------------+-------+ | autocommit | ON | + ---------------+-------+ |
通过修改autocommit变量可以关闭和开启操作
|
关闭当前会话的自动提交模式 mysql> set autocommit=0; mysql> show variables like 'autocommit' ; + ---------------+-------+ | Variable_name | Value | + ---------------+-------+ | autocommit | OFF | + ---------------+-------+ 全局的autocommit还是开启状态 mysql> show global variables like 'autocommit' ; + ---------------+-------+ | Variable_name | Value | + ---------------+-------+ | autocommit | ON | + ---------------+-------+ 关闭全局的autocommit mysql> set global autocommit=0; mysql> show global variables like 'autocommit' ; + ---------------+-------+ | Variable_name | Value | + ---------------+-------+ | autocommit | OFF | + ---------------+-------+ |
如果想要MySQL服务重启之后仍能生效,需要设置系统环境变量。MySQL5.7 在cnf配置文件中[mysqld]下面设置autocommit的值。
|
[mysqld] ... autocommit=0 |
Spring中对自动提交的控制
MySQL的JDBC驱动包 mysql-connector-java 会给会话的connection默认开启自动提交,譬如 mysql-connector-java-8.0.22版本的代码:
|
//com.mysql.cj.protocol.a.NativeServerSession.java private boolean autoCommit = true ; |
常用的数据库连接池 如HikariCP,druid等,默认也是开启自动提交,会将connection的自动提交设置都改为true。
druid在初始化DataSource的时候设置connection的autocommit为true。代码如下:
|
com.alibaba.druid.pool.DruidAbstractDataSource.java protected volatile boolean defaultAutoCommit = true ; ... public void initPhysicalConnection(Connection conn, Map<String, Object> variables, Map<String, Object> globalVariables) throws SQLException { if (conn.getAutoCommit() != defaultAutoCommit) { //将connection的autocommit设置为true conn.setAutoCommit(defaultAutoCommit); } ... } |
HikariCP 初始化DataSource的默认配置 中autocommit也是true:
|
com.zaxxer.hikari.HikariConfig.java public HikariConfig() { ... isAutoCommit = true ; } |
对于事务管理器PlatformTransactionManager管理的显式事务(譬如@Transactional注解声明)在 开启事务时会关闭自动提交模式。 代码如下:
|
@Override protected void doBegin(Object transaction, TransactionDefinition definition) { DataSourceTransactionObject txObject = (DataSourceTransactionObject) transaction; Connection con = null ; try { ........ // Switch to manual commit if necessary. This is very expensive in some JDBC drivers, // so we don't want to do it unnecessarily (for example if we've explicitly // configured the connection pool to set it already). if (con.getAutoCommit()) { txObject.setMustRestoreAutoCommit( true ); if (logger.isDebugEnabled()) { logger.debug( "Switching JDBC Connection [" + con + "] to manual commit" ); } //关闭自动提交模 con.setAutoCommit( false ); } ....... } catch (Throwable ex) { ....... } } |
总结
MySQL的autocommit模式默认是打开状态,为了防止手动的DML操作导致失误,生产环境可以设置为默认关闭的状态。一般的jdbc 连接池默认都是开启状态,而且是可配置的。显式事务下会设置成关闭状态,单纯的修改数据库环境的autocommit不会对代码的行为产生影响。
以上就是详解MySQL与Spring的自动提交(autocommit)的详细内容,更多关于MySQL 自动提交(autocommit)的资料请关注开心学习网其它相关文章!
原文链接:https://juejin.cn/post/6916415803852062734
- deepin数据库编程(deepin20.1系统安装MySQL8.0.23超详细的MySQL8安装教程)
- mysql拼接多字段作为查询条件(Mysql 实现字段拼接的三个函数)
- mysql删除的delete怎么找回(MySQL Delete 删数据后磁盘空间未释放的原因)
- mysql行级锁使用教程(浅析MySQL的lru链表)
- mysql触发器如何创建(MySQL 触发器的使用和理解)
- php不能用mysql(php写入mysql中文乱码的实例解决方法)
- MySQL定时任务(EVENT事件)如何配置详解(MySQL定时任务EVENT事件如何配置详解)
- 适合小白入门的mysql教程索引简介(一篇带给你MySQL高性能索引)
- mysql dateformat(MySQL的DATE_FORMAT函数的使用)
- mysql8.0如何配超时时间(解决MySQL8.0时区的问题步骤)
- mysql常用的sql语句大全(mysql建表常用的sql语句汇总)
- mysql超大表加字段(MySQL 大表添加一列的实现)
- mysql冷热数据分离方案(MySQL中使用流式查询避免数据OOM)
- key的用法归纳mysql(详解mysql中explain的type)
- mysqltruncate(MYSQL中Truncate的用法详解)
- mysql数据库怎么换行(MySQL数据中很多换行符和回车符的解决方法)
- TVB负评王连续挑战警察角色《使徒行者3》中将饰演卧底(TVB负评王连续挑战警察角色使徒行者3中将饰演卧底)
- 《精英律师》剧照首曝光,实力演员飙戏,演绎律政职场百态(精英律师剧照首曝光)
- 靳东领衔打造高精职场 新丽出品《精英律师》曝定妆照(靳东领衔打造高精职场)
- 靳东新剧《精英律师》定档,众星云集,这剧可追(靳东新剧精英律师定档)
- 精英律师 廖佳敏封印恋情曝光,顾婕马失前蹄 你个老不死的(廖佳敏封印恋情曝光)
- 以家人之名广受好评,剧情生动引起观众共鸣,演员张新成圈粉无数(以家人之名广受好评)
热门推荐
- ASP.NET中Server对象的用法
- python数字图像处理入门(python图像处理入门一)
- centos系统mysql安装及连接教程(CentOS8安装SQLServer2019的过程)
- 看懂云服务器带宽大小的区别(云服务器的流量与带宽是如何换算?)
- 创建自己的Visual Studio工程模板
- iis运行php程序(Windows2003+IIS7 Express使用FastCgi运行php)
- 微信html5页面怎么制作(HTML5中外部浏览器唤起微信分享功能的代码)
- 远程给docker容器执行命令(Docker命令让普通用户能够执行的实现)
- 用html5做一个音乐的播放器(HTML5自定义mp3播放器源码)
- php常见的数组函数(用php定义一个数组最简单的方法)