jdbc事物提交,回滚不起作用的解决方案
今天在写程序的时候发现一个奇怪的问题:
明明设置了事物非自动提交,但是当
回滚后,更新操作还是被执行了,并且不报任何错误.
下面是代码,代码是没有问题的:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.Statement;public class MAIN {
public static void main(String[] args) throws Exception {save();
}
public static void save() throws Exception{Class.forName("com.mysql.jdbc.Driver");Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/javadb","root","1234");conn.setAutoCommit(false);System.out.println(conn.getAutoCommit()+"conn.getAutoCommit");PreparedStatement stmt = conn.prepareStatement("insert into t_stock (stockNo,qty) values ('001037',10)");try{stmt.executeUpdate();throw new RuntimeException();}catch(RuntimeException e){conn.rollback();e.printStackTrace();System.out.println("huigun...");}finally{if (stmt != null){stmt.close();}if (conn != null){conn.close();}}
}
}
-----------------------------------------
首先分析代码:代码中sql语句执行以后,并没有commit操作
而是出了异常,进入了回滚,但是回滚没有成功,
说明肯定是设置conn.setAutoCommit(false);这句话
没有成功,也就是没有起作用,然后就考虑到
数据库是不是没有设置非自动提交,然后去看了看:
mysql> show variables like 'autocommit';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit | ON |
+---------------+-------+
1 row in set (0.04 sec)
可以看到数据库设置的是自动提交:
然后尝试把他设置成非自动提交:
mysql> set autocommit = 0;
这里设置成:
值0和OFF都是一样的,当然,1也就表示ON
----------------------------
但是当,关闭当前mysql窗口,又打开另一个窗口的时候
发现
mysql> show variables like 'autocommit';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit | ON |
+---------------+-------+
1 row in set (0.04 sec)
事物自动提交依然是开启的,也就是咱们的设置没有起作用,
仅仅是在当前窗口起了作用对吧.
所以就考虑,是不是数据库不支持事物
-------------------------
然后查到下面资料:
MySQL默认的存储引擎是MyISAM
可以通过:
show engines;
mysql> show engines;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine | Support | Comment | Transactions | XA | Savepoints |
+--------------------+---------+------------------------------------------------- --------------+--------------+------+------------+
| FEDERATED | NO | Federated MySQL storage engine | NULL | NULL | NULL |
| MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO |
| MyISAM | DEFAULT | MyISAM storage engine | NO | NO | NO |
| BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | NO | NO | NO |
| CSV | YES | CSV storage engine | NO | NO | NO |
| MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO |
| ARCHIVE | YES | Archive storage engine | NO | NO | NO |
| InnoDB | YES | Supports transactions, row-level locking, and foreign keys | YES | YES | YES |
| PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO |
+--------------------+---------+------------------------------------------------
而MyISAM存储引擎不支持事务处理,
所以改变autocommit没有什么作用。
但不会报错.所以一旦发生了这样的问题,很难排错.
接下来,咱们要做的就很明确了:
ALTER TABLE tb_chengji ENGINE = InnoDB;
修改表的存储引擎的类型,InnoDB是支持的,咱们可以看看;
这样再测试就好了
---------------------------------------
下面是找了,所有存储引擎类型的解释:
MySQL 数据表主要支持六种类型 ,分别是:BDB、HEAP、ISAM、MERGE、MYISAM、InnoBDB。
这六种又分为两类,一类是”事务安全型”(transaction-safe),包括BDB和InnoDB;其余都属于第二类,称为”非事务安全型”(non-transaction-safe)。
BDB 全称是”Brekeley DB”,它是Mysql最早的具有事务能力的表的类型,由Sleepycat Software
(http://www.sleepycat.com)开发。它提供了事务控制能力功能,它确保一组命令全部执行成功,
或者当任何一个命令出现错误时所有命令的结果都被回退,可以想像在电子银行中事务控制能力是非常重要的。
支持COMMIT、ROLLBACK和其他事务特性。最新版本的Mysql已经计划移除对BDB的支持,转而全力发展InnoDB。
InnoDB 是较新的事务安全型存储引擎,用于事务处理应用程序,支持BDB的几乎所有特性,并具有众多新特性,包括ACID事务支持。
特性:
事务处理机制
支持外链
崩溃后能立即恢复
支持外键功能,级联删除
支持并发能力
在硬盘上的存储方式:InnoBDB frm
最新版本的Mysql已经计划移除对BDB的支持,转而全力发展InnoDB。InnoDB对Mysql有更好的特性支持,而且开发社区活跃。
MyISAM 默认的MySQL插件式存储引擎,它是基于ISAM类型,但它增加了许多有用的扩展,它是在Web、数据仓储和其他应用环境下最常使用的存储引擎之一。注意,通过更改STORAGE_ENGINE配置变量,能够方便地更改MySQL服务器的默认存储引擎。
优点:
1.比ISAM表更小,所占资源更少
2.可以在不同平台间二进制移植表的类型在创建表时指定。
ISAM 是MyISAM类型出现之前MySQL表使用的默认类型,现在已经被MyISAM代替。
Memory (HEAP) 是MySQL表中访问最快的表,将所有数据保存在RAM中,在需要快速查找引用和其他类似数据的环境下,可提供极快的访问。注意,这种类型下数据是非持久化设计的,它一般适应于临时表,如果MySQL或者服务器崩溃,表中数据全部丢失。
Merge 是一种值得关注的新式表,它是由一组MyISAM表组成,之所合并主要出于性能上考虑,因为它能够提高搜索速度,提高修复效率,节省磁盘空 间。允许MySQL DBA或开发人员将一系列等同的MyISAM表以逻辑方式组合在一起,并作为1个对象引用它们。对于诸如数据仓储等VLDB环境十分适合。有时它以 MRG_MYISAM 名称出现。
Archive 为大量很少引用的历史、归档、或安全审计信息的存储和检索提供了完美的解决方案。
Federated 能够将多个分离的MySQL服务器链接起来,从多个物理服务器创建一个逻辑数据库。十分适合于分布式环境或数据集市环境。
NDBCluster/Cluster/NDB MySQL的簇式数据库引擎,尤其适合于具有高性能查找要求的应用程序,这类查找需求还要求具有最高的正常工作时间和可用性。
CSV 使用标准的CSV格式,由逗号隔开的文本文件,适应于外部数据交换
Blackhole 它会接受数据但不保存,而且对任何检索请求返回一个空集。它一般适应于数据会被自动复制并不进行本地保存的分布式数据库设计。(不确定的)似乎也可以用于临时禁止/忽略对数据库的应用程序输入。
Example 这是一个测试引擎,你可以创建一个这样的表,但既不能写入数据,也不能检索数据。它似乎是一个针对MySql开发者提供的示例引擎。
有关操作和查看表类型的命令语法如下
--------------------------------------
-- 创建表时指定表类型的方法
CREATE TABLE `message` (
`id` int(11) NOT NULL auto_increment,
`sender` varchar(255) default NULL,
`receiver` varchar(255) default NULL,
`content` text,
`is_read` char(1) default 'N',
`send_time` datetime default NULL,
`del_flag` tinyint(4) default '0',
PRIMARY KEY (`id`)
) ENGINE=MYISAM;
-- 也可以创建后更改:
ALTER TABLE `message` ENGINE = INNODB;
-- 查看表类型(存储引擎)
SHOW TABLE STATUS FROM `test`;
-- -- 结果为数据库test中所有表的信息,其中第二项type即是表的类型。
-- 查看表类型(存储引擎)2
SHOW CREATE TABLE `message`;
-- -- 结果为表message创建时的信息,其中有TYPE或ENGINE一项,指定了表的类型(存储引擎)。
-- show tables不能得到表类型的信息。
-------------------------------------
注意:老版本的MySQL使用 TYPE而不是ENGINE(例如,TYPE = MYISAM)。MySQL 5.1为向下兼容而支持这个语法,但TYPE现在被轻视,而ENGINE 是首先的用法。 一般地,ENGINE选项是不必要的;除非默认已经被改变了,MyISAM是默认存储引擎。
数据表的可移植性
常用的数据移植方法:把数据表的内容导出到一个文本文件中,然后拷贝到硬盘上,然后导入目标数据库里面。
就文件层次的操作来说,某些数据表是可以直接单独拷贝表文件来移动的
SAM No
MyIASM Yes
BDB No
InnoBDB Yes
jdbc事物提交,回滚不起作用的解决方案相关推荐
- mysql用jdbc执行回滚吗_java – mysql jdbc不成功回滚
我有一些 Java代码使用JDBC连接到 MySQL数据库,然后代码执行一些读操作然后单个更新,所有使用相同的连接.如果有异常,则调用connection.rollback();如果没有异常,则调用c ...
- @Transactional注解事务不回滚不起作用无效
@Transactional注解事务不回滚不起作用无效 以下内容均来自http://blog.csdn.net/u011410529/article/details/54287307 转载 这几天在项 ...
- Spring 事务提交回滚源码解析
2019独角兽企业重金招聘Python工程师标准>>> 前言 在上篇文章 Spring 事务初始化源码分析 中分析了 Spring 事务初始化的一个过程,当初始化完成后,Spring ...
- sql事务提交回滚命令_提交,回滚和保存点SQL命令
sql事务提交回滚命令 Transaction Control Language(TCL) commands are used to manage transactions in the databa ...
- springmvc + mybatise 一个service 处理处理多个mapper 事物不回滚
问题出现情况: 声明式事物@Transactional 在一个service调用了两个不同mapper 先后update两个数据,人为模拟后一个mapper异常,发现第一个mapper会提交数据 ...
- spring事务提交回滚原理mybatis版
sping事务非常简单好用,不用手动提交回滚事务,比如下面代码将2个更新操作一同提交,一同回滚. 上述代码基本没有任何有关jdbc事务的操作, 但却能将2个数据库更新操作同时提交与回滚,这是个值得思考 ...
- oracle 事务提交回滚吗,c# – 提交和回滚Oracle事务
我在oracle中用C#调用这个proc.我让proc返回错误.换句话说,proc失败并且pv_error用字符串填充并且回滚被触发,但是不起作用.我不知道为什么.那么,我做错了什么?提前致谢. pr ...
- spring@Transactional注解事务不回滚不起作用无效的问题处理
这几天在项目里面发现我使用@Transactional注解事务之后,抛了异常居然不回滚.后来终于找到了原因. 如果你也出现了这种情况,可以从下面开始排查. 一.特性 先来了解一下@Transactio ...
- Spring使用注解@Transactional事物手动回滚
https://blog.csdn.net/weixin_41141219/article/details/80751258
最新文章
- Go 学习笔记(56)— Go 第三方库 sqlx (操作数据库)
- 预、自训练之争:谷歌说预训练虽火,但在标注数据上自训练更有效
- 系统内存信息获取工具类
- 有关cvUpdateMotionHishtory,cvCalcMotionGradient等函数的使用
- Even Number Theory
- ubuntu16安装go语言
- vue使用class添加动态类
- 基础线性规划实现(matlab,lingo)
- Python使用exec自动生成代码并执行,同时得到返回的变量
- 在GRIDVIEW中合并单元格
- Dart 语言基础分步指南
- 【Love2d从青铜到王者】第四篇:Love2d之LÖVE与移动矩形
- Auto CAD线性不显示的解决办法
- 三维实时云渲染平台解决方案
- php 全等 性能,在PHP中,相等(==)和全等(===)的含义是一样的。
- PS-给文字填充图片纹理
- win10系统地图无法定位服务器,Win10无法启用定位功能(灰色)解决办法
- H5页面 禁止微信分享转发按钮
- 造车新势力平均月薪 15367 元,自动驾驶算法岗年薪百万
- R 语言assign 和get 函数用法