JDBC 的autoCommit属性 对于每一个 JDBC connection,都有一个autoCommit属性,只有执行commit后,该connection中的操作(statement操作)才会在数据库中真正执行 数据库默认是自动提交的,即数据库默认的的autoCommit属性是true。 Hibernate 的hibernate.connection.autocommit属性 Hibernate中hibernate.connection.autocommit属性用来设置获取到的 JDBC connection的autoCommit属性。 属性设为false,autoCommit=false(相当于connection 的start transaction)就是指开启jdbc的事务。
后来调整了一下思路,发现MySQL还有一个特性就是AutoCommit,即默认情况下,MySQL是开启事务的,下面表格能说明问题,表1: 但是,如果AutoCommit不是默认开启呢? 结果就会变成下面的表格,表2: 在关闭AutoCommit的条件下,SessionA在T1和T2两个时间点执行的SQL语句其实在一个事务里,因此每次读到的其实只是一个快照。 如下图: 无论如何commit,都无法改变这个连接的autocommit属性。 分析jdbc驱动代码可知,jdbc默认的AutoCommit状态是TRUE: 这实际上和MySQL的默认值是一样的。 因此,在这个连接被交还回连接池时,AutoCommit属性总是TRUE。 结论 任何查询接口都应该在获取连接以后进行AutoCommit的设置,将其设置为true。
个人网站、项目部署、开发环境、游戏服务器、图床、渲染训练等免费搭建教程,多款云服务器20元起。
image.png MySQL默认操作模式就是autocommit自动提交模式。这就表示除非显式地开始一个事务,否则每个查询都被当做一个单独的事务自动执行。 我们可以通过设置autocommit的值改变是否是自动提交autocommit模式。 通过以下命令可以查看当前autocommit模式 mysql> show variables like 'autocommit'; +---------------+-------+ | Variable_name sec) 从查询结果中,我们发现Value的值是ON,表示autocommit开启。 MySQL默认的存储引擎是MyISAM,MyISAM存储引擎不支持事务处理,所以改变autocommit没有什么作用。
看起来像是没有提交,立刻想到了mysql的autocommit,是不是没有提交事务?想到后立刻进行了验证,在执行insert语句后,又加了一行程序提交事务:connection.commit()。 为了进一步证实MySQLdb模块会将autocommit功能关闭,看了mysql的日志,发现有set autocommit=0,进一步证实了,MySQLdb模块默认会关闭autocommit功能。 如果不希望默认关闭,解决办法有几种: 1、显示执行SQL语句"COMMIT;" 2、使用connection的commit方法:connection.commit() 3、设置自动提交:connection.autocommit
直接写了个简单的mysql pdo 连接数据库,并且插入数据到innodb表里面,结果没有任何问题,成功了,然后我就想到pdo里面有个参数PDO::ATTR_AUTOCOMMIT,是不是他在作怪? 使用getAttribute(PDO::ATTR_AUTOCOMMIT)) 获取他的值,打印,发现是1,证明是自动提交事务的 然后在我封装的框架里面,我打印了他的值,发现是0,问题找到 那么,在插入的时候 连接数据库的时候,options里面设置 PDO::ATTR_AUTOCOMMIT 为 1 插入操作的时候,自己执行commit,显式的完成一次事务,我采用了这个方法 遗留问题是,同样的PHP版本,为啥单独的连接 PDO::ATTR_AUTOCOMMIT为1 ,在启动的swoole-httpserer里面是0,我没有继续深入。
; +---------------------+ | @@global.autocommit | +---------------------+ | 0 | +-------------------- -+ 1 row in set (0.00 sec) 为某个变量赋值 /*为某个系统变量赋值*/ set global autocommit=0; set @@global.autocommit=1; mysql> set global autocommit=0; Query OK, 0 rows affected (0.00 sec) mysql> select @@global.autocommit ; +---------------------+ | @@global.autocommit | +---------------------+ | 0 | +-------------------- > select @@global.autocommit;+---------------------+ | @@global.autocommit | +---------------------+
方式 2 SET autocommit = 0; 默认情况下 autocommit = 1,是自动提交事务的。 autommit 是 session 级别的,就是当前连接更改了 autocommit,对其他连接没有影响。 设置 autocommit 之后,本次连接的所有 sql 都是事务的形式,比如每次 commit 提交。 ? 通过截图可以看出,有一个事务在执行,因为设置了 set autocommit = 0;,所以后面的 update 操作修改结果,其他 session 并不会查到(RR 级别)。 注意的是,autocommit 没有进行更改,此时 autocommit 值还是 0,也就意味着这个 session 后续的 sql 都是需要手动 commit 的。 ? - <End /> -
image.png 方式 2 SET autocommit = 0; 默认情况下 autocommit = 1,是自动提交事务的。 autommit 是 session 级别的,就是当前连接更改了 autocommit,对其他连接没有影响。 设置 autocommit 之后,本次连接的所有 sql 都是事务的形式,比如每次 commit 提交。 image.png 通过截图可以看出,有一个事务在执行,因为设置了 set autocommit = 0;,所以后面的 update 操作修改结果,其他 session 并不会查到(RR 级别)。 注意的是,autocommit 没有进行更改,此时 autocommit 值还是 0,也就意味着这个 session 后续的 sql 都是需要手动 commit 的。
其他历史文章, 《PLSQL Developer中文乱码问题》 《PLSQL Developer免密登录》 今天朋友碰巧问了个问题,PLSQL Developer的Preferences首选项中这个“AutoCommit 首先看了下工具自带的手册,对“AutoCommit posted records”的介绍, AutoCommit posted records. 重点来了,如果勾选了“AutoCommit posted records”,此时刚才编辑的数据,会自动提交,工具栏中commit和rollback的按钮是灰的, ? 其实能想象到,“AutoCommit SQL”和“AutoCommit posted records”针对的是两种不同场景的数据维护操作,一个是通过SQL完成的数据增删改(“AutoCommit SQL ”),另一个则是通过for update编辑结果集表格的形式完成数据增删改(“AutoCommit posted records”)。
#约158行附近 158 :param autocommit: Autocommit mode. None means use server default. ='YeWen.3306', port= 3306, db='test', charset='utf8mb4', autocommit=True) 2. 但还要更进一步,开启或关闭autocommit有什么利弊呢?简言之,有几点建议: 当有大批量数据更新时,可以先关闭autocommit,等事务结束后,再手动提交。 关闭autocommit的缺点在于,当忘记主动提交事务时,可能会造成相应的行锁一直持有不释放,其他事务会被长时间阻塞,如果是线上生产环境,则可能造成严重后果(业务长时间不可用)。 因此,需要根据实际情况动态调整autocommit的模式,并没有通用的设置。
自动提交 默认情况下,MySQL 是自动提交(autocommit)的。也就意味着:如果不是显式地开始一个事务,每个查询都会被当做一个事务执行 commit。 在当前连接中,可以通过设置 autocommit 来修改自动提交模式: mysql> show variables like 'autocommit'; +---------------+------- ,0或OFF表示禁用自动提交模式 如果设置了autocommit=0,当前连接所有事务都需要通过明确的命令来提交或回滚。 对于 MyISAM 这种非事务型的表,修改 autocommit 不会有任何影响,因为非事务型的表,没有 commit或 rollback 的概念,它会一直处于 autocommit 启用的状态。 小结 本小节主要介绍了 MySQL 中事务控制的一些特点,如何调整自动提交(autocommit)、如何调整隔离级别调整、以及讲解了在事务中使用混合存储引擎的缺点。
,我们会发现有一个参数是autoCommit,也就是自动提交,我们可以看到上一步传值是false,也就是不会自动提交,通过configuration(主配置)获取environment(运行环境),然后通过 this.autoCommit && this.dirty的值就是true,那么就短路了,所以整个表达式的值就是true。 this.autoCommit && this.dirty || force; } 返回上一层的,我们知道this.isCommitOrRollbackRequired(force)的返回值是true。 autoCommit是true,但是dirty已经是false,所以! this.autoCommit是true,那么整个表达式就是true。
,我们会发现有一个参数是autoCommit,也就是自动提交,我们可以看到上一步传值是false,也就是不会自动提交,通过configuration(主配置)获取environment(运行环境),然后通过 = autoCommit; } 3.增删改是怎么执行的 我们使用到这句代码: sqlSession.insert("insertStudent",student); 我们发现同样是接口方法 this.autoCommit && this.dirty的值就是true,那么就短路了,所以整个表达式的值就是true。 autoCommit**是true,但是dirty已经是false,所以! this.autoCommit是true,那么整个表达式就是true。
public interface SqlSessionFactory { SqlSession openSession(); SqlSession openSession(boolean autoCommit SqlSession openSession(ExecutorType execType); SqlSession openSession(ExecutorType execType, boolean autoCommit ) { return openSessionFromDataSource(execType, null, autoCommit); } public SqlSession openSession tx = transactionFactory.newTransaction(environment.getDataSource(), level, autoCommit); //execType ; try { autoCommit = connection.getAutoCommit(); } catch (SQLException e) {
由于我们使用的 druid 连接池,它的 autoCommit 默认为 true,所以我此时将 druid 连接池的 autoCommit 参数设置为 false,再次跑测试代码,发现此时 oracle 可以这么理解,在 Spring 体系下的 Mybatis 事务管理器,autoCommit 的值被数据库连接池的覆盖掉了! 默认为 true,而事务管理器获取 connection 对象时,又将 connection 的 autocommit 赋值给事务管理器,如果此时 autoCommit 为 true,Mybatis 根据测试结果,将 druid 的 autoCommit 设置为 false 后,不会发生阻塞现象,即 Mybaits 会执行下面的 commit 操作。 那么问题来了,connection 的 autocommit = true 时,到底有没有 commit ?从测试结果来看,很明显没有 commit。
autocommit模式:在开启情况下,对于每条statement来说,都会自动形成一个commit,也就是会即时对开始和结束一个事务。 所以,当出现rollback to savepoint出现这个错误时,第一步是检查autocommit模式是否有开启。 select @@autocommit; 1则代表开启,0则代表未开启。 如果需要关闭,则输入以下代码 set autocommit = 0 ; 这时候,就是必须对每一个事务都要手动开始或保存。 代码为 START TRANSACTION # OR BEGIN 要结束的话,就要comment或者rollback来结束这个阶段 在autocommit开启的情况下,也可以人为地,将好几个statement
如果 autocommit 从 0 改为 1 ,那么事务中的操作将被自动提交。我们还可以使用 START TRANSACTION 或 BEGIN 语句来启动事务。 , connection to the MySQL server begins with autocommit mode enabled, which automatically commits every To use multiple-statement transactions, switch autocommit off with the SQL statement SET autocommit = To leave autocommit on, begin each transaction with START TRANSACTION and end it with COMMIT or ROLLBACK https://dev.mysql.com/doc/refman/8.0/en/innodb-autocommit-commit-rollback.html 在官方的例子可以看到, SET autocommit
自动提交(AUTOCOMMIT) MySQL 默认采用自动提交模式。 也就是说每个查询都被当作一个事务执行提交操作,可以设置 AUTOCOMMIT变量来启用或者禁止自动提交模式: # 查询当前的模式 show variables like 'AUTOCOMMIT' # 禁用自动提交 SET AUTOCOMMIT = 0; 当 AUTOCOMMIT=0时,所有的查询都是在一个事务中,直到显示的执行 COMMIT 或者 ROLLBACK AUTOCOMMIT对非事务存储引擎不会有任何影响 自动提交(AUTOCOMMIT) MySQL 默认采用自动提交模式。 禁用自动提交 SET AUTOCOMMIT = 0; 当 AUTOCOMMIT=0时,所有的查询都是在一个事务中,直到显示的执行 COMMIT 或者 ROLLBACK AUTOCOMMIT对非事务存储引擎不会有任何影响
汽车相关识别(Vehicle OCR)提供驾驶证识别、行驶证识别、车牌识别、车辆VIN码识别等多种服务,支持将图片上的文字内容,智能识别为结构化的文本,可应用于车主身份认证、ETC出行、违章识别、停车管理等多种场景,大幅提升信息处理效率。大幅提升信息处理效率。
扫码关注腾讯云开发者
领取腾讯云代金券