最近需要通过JDBC对数据库做事务型操作,实践时发现,并没有达到想要的效果,表现在:1、每次执行executeUpdate()后,数据就马上能在DB中查到。但按理来说,我还没执行commit(),DB中不应该有这个数据;2、执行rollback()时,数据也没回滚。

定位问题后,发现是数据库表类型在作祟:
当时设定的“表类型”为MyISAM,而这种类型,是不支持事务操作的。
能够支持事务操作的表类型是“InnoDB",修改表类型为”InnoDB"后,事务操作终于正常了。

按网上的说法,InnoDB尽管功能更强大,但查询性能要比MyISAM差一些

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等,都一定要记住在处理完之后要提交或者回滚哦。

mysql事务的坑----MyISAM表类型不支持事务操作相关推荐

  1. 支付宝的数据库是MySQL变种_浅谈MySql的储存引擎(表类型)

    浅谈mysql的存储引擎(表类型) 什么是MySql数据库 通常意义上,数据库也就是数据的集合,具体到计算机上数据库可以是存储器上一些文件的集合或者一些内存数据的集合. 我们通常说的MySql数据库, ...

  2. mysql - MySQL常用的七种表类型(转)/表分类

    其实MySQL提供的表类型截至到今天已经有13种,各有各的好处,但是民间流传的常用的应该是7种,如果再细化出来,基本上就只有两种:InnoDB.MyIASM两种. MySQL作为当前最为流行的免费数据 ...

  3. MySQL锁机制(myisam表所与innoDB锁)

    目录 1.MySQL锁的基本介绍 2.MyISAM表锁 2.1写锁阻塞读 2.2读阻塞写 3.InnoDB锁 3.1.事务及其ACID属性 3.2.并发事务带来的问题 3.3.1.在不通过索引条件查询 ...

  4. 浅谈 MySQL 的存储引擎(表类型)

    什么是MySql数据库 通常意义上,数据库也就是数据的集合,具体到计算机上数据库可以是存储器上一些文件的集合或者一些内存数据的集合. 我们通常说的MySql数据库,sql server数据库等等其实是 ...

  5. 浅谈MySql的存储引擎(表类型)

    转载自 http://www.cnblogs.com/lina1006/archive/2011/04/29/2032894.html 什么是MySql数据库 通常意义上,数据库也就是数据的集合,具体 ...

  6. mysql fulltext类型,mysql – 使用的表类型不支持FULLTEXT索引

    我将此表数据导入phpmyadmin: CREATE TABLE IF NOT EXISTS `cms_books` ( `id` bigint(20) NOT NULL, `title` varch ...

  7. mysql1214_mysql – #1214 – 使用的表类型不支持FULLTEXT索引

    在MySQL 5.6全文本搜索仅支持MyISAM引擎之前. 因此,请将表的引擎更改为MyISAM CREATE TABLE gamemech_chat ( id bigint(20) unsigned ...

  8. mysql 事物封装_mysqls 一个node对mysql的封装库 链式调用、支持事务

    在我自己的平常开发中很少有见到javascript对sql的封装比较好的库(找了一圈也没找到.应该是暂时我没发现),因此前期的项目中根据自己的项目情况实现了一套封装方法. 最近我准备写一个这样的库,基 ...

  9. mysql表的类型_浅谈MySQL表类型

    MySQL为我们提供了很多表类型供选择,有MyISAM.ISAM.HEAP.BerkeleyDB.InnoDB,MERGE表类型,萝卜白菜各有所爱是不假,可是真正选择何种表类型还是要看业务需要啊,每一 ...

最新文章

  1. 深圳网络推广总结影响网站优化的不友好设计有哪些?
  2. Linux RPM 常用命令
  3. 知乎的 Flink 数据集成平台建设实践
  4. css 宽高最大值最小值 0303
  5. 从分库分表到Database Plus,重新认知ShardingSphere
  6. 数据处理--One Hot Encoding
  7. 熵编码之指数哥伦布编码(六)
  8. c语言开发实际,21实际c语言教程-1 (转)
  9. BUG Error:Execution failed for task ':app:dexDebug'.
  10. 常见的Ajax写法汇总
  11. 若依源码学习7:Excel 导入导出
  12. 微信小程序怎么做店铺_微信小程序如何开通店铺
  13. 计算机控制系统编程语言有哪些,PLC编程语言有哪些种类
  14. Python数据类型——逻辑值详解
  15. 下载CSS参考手册之后打开却无法显示
  16. 一个海量在线用户即时通讯系统(IM)的完整设计
  17. 单纤双向BIDI光模块常识
  18. 【java】关于java编程语言开发
  19. 51单片机定时器的原理与使用
  20. 进程和线程的区别,进程间通信方式,怎么选择比较好

热门文章

  1. vue3使用screenfull实现全屏
  2. vivado时序约束
  3. Redis集群使用指南
  4. mysql的id生成uuid
  5. Python 和 Java 处理废弃API的方法
  6. 策略模式代替if-else
  7. 因子分析模型(主成分解)、及与主成分分析模型的联系与区别(附详细案例)
  8. CCF人工智能的A类期刊会议列表
  9. mex matlab混编,mex混编后运行总是导致matlab崩溃是什么情况?
  10. C语言程序初体验第五题