Connection.setAutoCommit使用的注意事项

2023-11-19

setAutoCommit总的来说就是保持数据的完整性,一个系统的更新操作可能要涉及多张表,需多个SQL语句进行操作

循环里连续的进行插入操作,如果你在开始时设置了:conn.setAutoCommit(false);
最后才进行conn.commit(),这样你即使插入的时候报错,修改的内容也不会提交到数据库,
而如果你没有手动的进行setAutoCommit(false);
出错时就会造成,前几条插入,后几条没有
会形成脏数据~~

setAutoCommit(false)的误用
设定setAutoCommit(false)没有在catch中进行Connection的rollBack操作,操作的表就会被锁住,造成数据库死锁):
误用Connection.setAutoCommit导致的数据库死锁问题。

系统在发布到用户的的服务器了,运行一段时间偶尔出现某些功能不能正常运行,甚至不能自动恢复,严重导致服务器当机,表现为服务器不响应用户的请求,数据库有大量的锁。在服务器重启后才能恢复正常。今天通遍的查看了一下代码,初步分析了原因,记录了下来,跟大家交流交流。
先看下面一段有问题的代码:
 
1       Connection con =  null ;
2       try {
3          con = getConnection();
4          con.setAutoCommit( false );
            /*
5          * update USER set name=’winson’ where id=’000001’;
            */
6          con.commit();
7       } finally {
8           if (con!= null ){
9               try  {
10                 con.close();
11             }  catch  (SQLException e) {
12                 e.printStackTrace();
13             }
           }
       }
分析:问题就出现在第 4 行,写代码的人把数据库连接 con  设置成非自动提交,但没有在执行出现异常的时候进行回滚。如果在执行第 5 行的时候出现异常, con 既没有提交也没有回滚,表 USER 就会被锁住 ( 如果 oracle 数据库就是行锁 ) ,而这个锁却没有机会释放。有人会质疑,在执行 con.close() 的时候不会释放锁吗?因为如果应用服务器使用了数据库连接池,连接不会被断开。
附:在 oracle 上查看锁的方法: select * from v$lock_object 或者 select * from v$lock.
JDBC api 文档是这样对 setAutoCommit 方法解释的:
Sets the connection's auto-commit mode to   enableAutoCommit.
      Newly created   Connection  objects are in auto-commit mode by default, which means that individual SQL statements are committed automatically when the statement is completed. To be able to group SQL statements into transactions and commit them or roll them back as a unit, auto-commit must be disabled by calling the method   setAutoCommit  with   false  as its argument.   When auto-commit is disabled, the user must call either the commit or rollback method explicitly to end a transaction.(一定不能大意哦,如果设置成非自动提交,在最后一定要调用commit或者rollback方法)
      The commit occurs when the statement completes or the next execute occurs, whichever comes first. In the case of statements returning a ResultSet object, the statement completes when the last row of the result set has been retrieved or the ResultSet object has been closed. In advanced cases, a single statement may return multiple results as well as output parameter values. In this case, the commit may occur when all results and output parameter values have been retrieved, or the commit may occur after each result is retrieved.
 
参考正确的写法应该是:
        Connection con =  null ;
        try {
           con = getConnection();
           con.setAutoCommit( false );
            /*
            * do what you want here.
            */
           con.commit();
        } catch (Throwable e){
            if (con!= null ){
                try  {
                   con.rollback();
               }  catch  (SQLException e1) {
                   e1.printStackTrace();
               }
           }

throw new RuntimeException(e);

        } finally {
            if (con!= null ){
                try  {
                   con.close();
               }  catch  (SQLException e) {
                   e.printStackTrace();
               }
           }
       }
 
这种疏忽很容易出现,但又导致非常严重的运行问题。所以在这里作个提醒,以后在处理外部资源的时候一定要格外小心。今天还发现代码中一些地方滥用 synchronized 关键字,导致系统性能受到很大的影响,处理不当跟前面提到问题一起出现,那系统就是时候 over 了。 
另外,如果不是自己来处理事务,可能在用hibernate或者ejb等,都一定要记住在处理完之后要提交或者回滚哦。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Connection.setAutoCommit使用的注意事项 的相关文章

  • TransactionScope 超时过早发生?

    我在用着TransactionScope进行一些批量插入和更新 问题是 即使我设置了超时 我也会在 30 分钟长的操作中遇到超时异常TransactionScope到一小时 此外 在异常之后 它会插入看似随机数量的批次记录 例如 最后一个操
  • 从事务范围调用 WCF 服务方法

    我有这样的代码 using TransactionScope scope TransactionScopeFactory CreateTransactionScope some methodes calls for which scope
  • C# 事务中的事务

    我正在使用 C 将发票的平面文件导入到数据库中 如果遇到问题 我将使用 TransactionScope 回滚整个操作 这是一个棘手的输入文件 因为一行不一定等于一条记录 它还包括链接记录 发票将包含标题行 行项目和总计行 有些发票需要跳过
  • 实体框架核心事务中的多个 SaveChanges 有什么意义?

    我在 net core 应用程序中使用 EF 我想知道调用之间有什么区别SaveChanges在事务期间多次调用 并且在提交之前仅调用一次 为了更好地说明我的问题 我将提供一些伪代码 public async Task
  • Spring Service @Transactional 不回滚事务 Mybatis SqlSession

    目标是在失败时回滚所有 任何事务 但这并没有按预期工作 我们使用Spring MVC JMS Service Mybatis 在日志中 JMS 设置为回滚 但行已插入且未回滚 想知道我错过了什么或做错了什么吗 最近添加了 Transacti
  • MySQL InnoDB引擎是否对只读事务运行任何性能优化

    根据参考文档 只读事务标志可能会提示存储引擎运行一些优化 设置会话事务只读 如果事务访问模式设置为 READ ONLY 则对表进行更改 被禁止 这可能使存储引擎能够提高性能 不允许写入时可能进行的改进 InnoDB引擎是否对只读事务运行这样
  • Paypal PDT交易ID有效期

    当我尝试使用交易 ID 检索付款信息时 我从 paypal PDT 收到错误 4003 虽然我这里有一个类似的线程 贝宝 PDT 错误 4003 https stackoverflow com questions 8521800 paypa
  • 在 Spring 中使用事务时创建提交后

    由于某些原因 我使用 Spring PlatformTransactionManager 手动执行事务提交和回滚 我需要做的是设置一个钩子 以便在提交事务后发生提交后操作 通过查看 void commit TransactionStatus
  • Oracle 事务在 C++ 和 Java 之间的传播

    我们有一个现有的 C 应用程序 我们将逐步将其替换为新的基于 Java 的系统 在我们用 Java 完全重新实现所有内容之前 我们期望 C 和 Java 必须相互通信 RMI SOAP 消息传递等 我们尚未决定 现在我的经理认为我们需要 J
  • 如何查看任意 Oracle 会话正在使用的事务隔离级别

    我试图找出特定会话 不是我自己的会话 在 Oracle 服务器上的隔离级别 有 v 视图可以得到这个吗 您可以在中测试位 28flag列于v transaction 1 http forums oracle com forums threa
  • TransactionScope 的细微差别

    假设我有两个线程 它们在特定于线程的 TransactionScope 中执行一些面向数据库的代码 并具有 ReadCommissed 隔离级别 但是有一些表的数据应该共享 不应创建重复项 using var transactionScop
  • 在单个更新语句上使用事务

    我在工作中为一些 SP 配音 我发现编写代码的人在单个更新语句上使用了事务 如下所示 begin transaction single update statment update table whatever with whatever
  • MySQL“选择更新”行为

    根据 MySql 文档 MySql 支持多粒度锁定 MGL case 1 开放航站楼 1 连接到mysql mysql gt start transaction Query OK 0 rows affected 0 00 sec mysql
  • Postgres、更新和锁定顺序

    我正在研究 Postgres 9 2 有 2 个更新 每个更新都有自己的事务 一个看起来像 UPDATE foo SET a 1 WHERE b IN 1 2 3 4 另一个也类似 UPDATE foo SET a 2 WHERE b IN
  • 如何在 Loopback 中实现 ACID 事务

    我们一直在尝试在 Loopback 中实现 ACID 事务 但没有成功 文档中唯一的示例使用 create 方法 我们尝试完全覆盖事件以及操作挂钩的多种变体 我们只能让创建示例正常工作 核心要求 我们需要能够在特定模型的create和upd
  • Febelfin CODA(编码账户报表)2.3 仅在比利时使用?

    我的任务是编写一些代码来解释来自 不同 比利时 银行的 CODA 文件 CODA 文件代表编码帐户文件文件 似乎是文本文件的比利时名称 其中包含特定银行帐户上发生的每笔银行交易的一行 这包括 SEPA 直接借记交易信息 我们合作的前 2 家
  • Sails.js + Postgres:交易问题

    我试图使用 Postgres 作为数据库在 Sails 0 10 5 中实现事务 但操作最终没有提交 或回滚 这是我作为测试写下的一个简单的事务场景 使用 async js testTransaction function uri var
  • 我想最小化@Transactional 的范围吗?

    不确定 范围 在这里是否是正确的术语 我使用 Spring 进行 JPA 事务管理 下面有 Hibernate 我执行数据库事务的方法是私有的 但是由于您只能在类或类上设置 Transactional公共方法 http static spr
  • 2PC vs Sagas(分布式事务)

    我正在深入了解分布式系统 以及如何在此类系统中维护数据一致性 其中业务事务涵盖多个服务 有界上下文和网络边界 我知道以下两种用于实现分布式事务的方法 2 阶段提交 2PC Sagas 2PC 是一个应用程序协议透明地在平台的支持下利用全球A
  • 在 JUnit 中使用 Spring 测试服务时如何回滚数据库事务?

    我测试我的 DAO 和服务没有问题 但是当我测试时INSERTs or UPDATE我想回滚事务而不影响我的数据库 我在用着 Transactional在我的服务中管理交易 我想知道 是否有可能知道事务是否正常 但回滚它以防止更改数据库 这

随机推荐

  • Linux-挖矿木马清理

    一 什么是挖矿木马 挖矿木马会占用CPU进行超频运算 从而占用主机大量的CPU资源 严重影响服务器上的其他应用的正常运行 黑客为了得到更多的算力资源 一般都会对全网进行无差别扫描 同时利用SSH爆破和漏洞利用等手段攻击主机 部分挖矿木马还具
  • ConstraintLayout系列:ConstraintLayout实现左右均分布局

    效果图 关键代码 android layout width 0dp 0dp在ConstraintLayout中的含义是match constraint 完整代码
  • CTex的基本用法

    主要内容 Latex简介 命令和环境 文档排版和组织 普通文本编辑 数学公式编辑 图形 插图 表格 文献等的编辑 一 Latex简介 1 概述 首先要从TEX介绍起 TEX是斯坦福大学的教授Donald E Knuth 图灵奖获得者 开发的
  • django.db.utils.DataError: (1406, “Data too long for column ‘name‘ at row 1“)

    报错现象 django db utils DataError 1406 Data too long for column name at row 1 排除故障 当时第一反应是上网百度 结果搜出来的结果都是改字符集 但明显我这个和字符集关系不
  • 单片机语音识别原理

    语音识别是一门交叉学科 近二十年来 语音识别技术取得显著进步 开始从实验室走向市场 人们预计 未来10年内 语音识别技术将进入工业 家电 通信 汽车电子 医疗 家庭服务 消费电子产品等各个领域 语音识别听写机在一些领域的应用被美国新闻界评为
  • 基于SSM框架的多文件上传Controller类编写

    前端代码
  • Spring Boot 从Json静态文件中读取数据

    Spring Boot 从Json静态文件中读取数据 在实体中 通常使用类似字典表的文件来表示属性 文件大都配置在配置文件中 也可以是静态文件 本次记录如何从静态json文件中读取所需字段 1 文件格式以及路径 2 加载文件 import
  • QT进程间通信 详细介绍

    在QT中 信号和槽的机制取代了这种繁杂的 易崩溃的对象通信机制 信号是当对象状态改变时所发出的 槽是用来接收发射的信号并响应相应事件的类的成员函数 信号和槽的连接是通过connect 函数来实现的 AD 1 QT通信机制 为了更好的实现QT
  • MVC三层架构

    1 什么是MVC Model View Controller 模型 视图 控制器 模型就是Java对应数据库的那些字段 实体类 视图 就是JSP页面 控制器 就是Servlet负责跳转页面 Controller作用 Controller其实
  • Android addview—动态添加view

    一 前言 在日常的开发中经常遇到需要动态添加子view的情况 addview是ViewGroup的特有方法 可以在布局中动态添加view 而view是不存在这个方法的 二 使用方式 1 方法介绍 addview有以下几种方式 addView
  • vue+websocket+express+mongodb实战项目(实时聊天)(二)

    原项目地址 vue websocket express mongodb实战项目 实时聊天 一 http blog csdn net blueblueskyhua article details 70807847 github地址 https
  • JAVA按钮编程_Java编程实现swing圆形按钮实例代码

    Swing是一个为Java设计的GUI工具包 Swing是JAVA基础类的一部分 Swing包括了图形用户界面 GUI 器件如 文本框 按钮 分隔窗格和表 Swing提供许多比AWT更好的屏幕显示元素 它们用纯Java写成 所以同Java本
  • Linux——pthread_create()

    1 pthread create pthread create是 Unix Linux Mac OS X 等操作系统的创建线程的函数 它的功能是创建线程 实际上就是确定调用该线程函数的入口点 在线程创建以后 就开始运行相关的线程函数 函数原
  • KITTI SOTA!Dual Fusion:减少Lidar-Camera融合特征不对齐问题

    点击下方卡片 关注 自动驾驶之心 公众号 ADAS巨卷干货 即可获取 点击进入 自动驾驶之心 多传感器融合 技术交流群 后台回复 多传感器融合综述 获取图像 激光雷达 毫米波雷达融合综述等干货资料 摘要 融合来自相机和激光雷达传感器的数据是
  • 基于ICL8038的正弦波、方波和三角波发生器protues仿真设计

    一 设计任务与要求 设计 组装 调试信号发生器电路 使它能输出正弦波 方波和三角波 可采用集成芯片ICL8083 其频率在20HZ 20KHZ范围内连续可调 输出正弦波 方波 三角波 正弦波 二 原理电路设计 1 设计方案 方案的结构框图如
  • ToBase64String方法 - 理想的地方的日志 - 网易博客

    用ToBase64String方法可以在不丢失数据的情况下将字节数组转成字符串 在ToBase64String方法中 会对字节数组中的连续三字节进行一次编码 编码得的字符串长度为4位 而且得出来的4位的字符串里面的字符肯定是由大小写字母 数
  • 如何发现系统改进点,优化点,提高点,新系统 边界感不要太强

    技术人员规划能力 如何规划新的系统 技术规划能力 个人渣记录仅为自己搜索用的博客 CSDN博客 1 协作中 双方系统对接 边界感不要太强 肯定会不爽 不爽的点里可以挖掘改进点 肯定会有很多冲突 对方技能欠缺 对方耽误你的时间 可以想下有没有
  • 三分钟阿里云服务器u1通用算力型性能、使用限制及费用说明

    阿里云服务器u1是通用算力型云服务器 CPU采用2 5 GHz主频的Intel R Xeon R Platinum处理器 通用算力型u1云服务器不适用于游戏和高频交易等需要极致性能的应用场景及对业务性能一致性有强诉求的应用场景 比如业务HA
  • 关于人脸识别的心得随笔(持续更新)

    2020 4 25 目前 在监控系统图像中 可以将肤色作为人脸识别的依据 RGB颜色空间是由三基色组成 亮度色度混合 肤色聚集效果差 需要转换到亮度与色度分离的模型 HSV模型 其中的脸部区域像素H分量中 效果最佳 已知的数据降维的算法有
  • Connection.setAutoCommit使用的注意事项

    setAutoCommit总的来说就是保持数据的完整性 一个系统的更新操作可能要涉及多张表 需多个SQL语句进行操作 循环里连续的进行插入操作 如果你在开始时设置了 conn setAutoCommit false 最后才进行conn co