Mysql数据库无法使用事务回滚

package jdbc02;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import org.junit.Test;
import jdbc02.*;
public class TransactionTest {
/**
 * Tom 给Jerry 汇款500元
 * 
 * 关于事务:
 * 1. 如果多个操作,每个操作使用的是自己的单独的连接,则无法保证事务。
 * 2. 具体步骤
 * 1) 事务操作之前,开始事务:取消Connection 的默认提交行为
 * 2) 如果事务的操作都成功,则提交事务,
 * 3)回滚事务
 */
@Test
public void testTransaction(){
Connection connection = null;
try {
connection = JDBCTools.getConnection2();
//开始事务:取消默认提交
connection.setAutoCommit(false);
System.out.println(connection.getAutoCommit());
String sql1 = "UPDATE users SET balance = balance-500 where id = ?";
String sql2 = "UPDATE users SET balance = balance+500 where id = ?";
update(connection, sql1, 2);
int i = 10 / 0 ; 
update(connection, sql2, 1);
//提交事务
connection.commit();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
//回滚事务
try {
connection.rollback();;
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}finally{
JDBCTools.release(null, null, connection);
}
//Dao dao = new Dao();
//String sql1 = "UPDATE users SET balance = balance-500 where id = 1";
//String sql2 = "UPDATE users SET balance = balance+500 where id = 2";
//
//dao.update(sql2);
//dao.update(sql1);
}
public static void update(Connection connection,String sql,Object ...args){
PreparedStatement preparedStatement = null;
try {
System.out.println(connection.getAutoCommit());
preparedStatement = connection.prepareStatement(sql);
for(int i = 0 ; i < args.length ; i ++){
preparedStatement.setObject(i+1, args[i]);
}
preparedStatement.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
}finally{
JDBCTools.release(null, preparedStatement, null);
}
}
}

上面是出错时的代码,应该是没问题的,是为了学习事务写的测试代码,但却一直不能实现回滚。

直接说解决方法吧,因为mysql数据库默认表不支持事务回滚...

修改Table Type为 innoDB就可以了。

时间: 2024-12-24 14:01:38

Mysql数据库无法使用事务回滚的相关文章

为什么mysql事务回滚后, 自增ID依然自增

事务回滚后,自增ID仍然增加,回滚后,自增ID仍然增加.比如当前ID是7,插入一条数据后,又回滚了.然后你再插入一条数据,此时插入成功,这时候你的ID不是8,而是9.因为虽然你之前插入回滚,但是ID还是自增了. 如果你认为自增ID不应该被事务化,那么其他事务不得不等待着,检查自增ID是被使用还是被回滚,这就导致阻塞. 比如下面的例子,A表使用自增ID. User 1 ------------ begin transaction insert into A ... insert into B ..

经验总结55--spring开启事务回滚

使用spring的@Transactional注解,异常时,进行事务回滚. 1.引用 xmlns:tx="http://www.springframework.org/schema/tx" http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd 2.开启事务 <tx:annotation-driven transaction-manager=&q

thinkphp curd的事务回滚 一看就会

/** *thinkphp数据库的事务回滚例子 *这一般用在多表操作,比如: (1)订单表和其他订单关联信息,删除订单同时也要把订单关联表中的信息删掉,如果说删除了订单表结果在删除订单关联信息表时出现问题,也就是说,订单的关联信息没有删掉,这时就会出现信息不对应,甚至信息的冗余,这时采用事务回滚,如果一个没有删掉,之前的也要回滚,保持记录的对应统一 (2)银行打钱,如果A给B打钱,给Binsert成功了,但是Adelete失败,这时银行就亏大了,明白?此时就要回滚,如果两者其中一者不成立,则都复

数据库事务处理机制之事务回滚问题讨论

一.Sql中的事务 概念:事物是一种机制,是一种操作序列,它包含了一组数据库操作命令,这组命令要么全部执行,要么全部不执行.事务是一个不可分割的工作逻辑单元.在数据库系统上执行并发操作时事务是作为最小的控制单元来使用的.多用户登录系统适于使用事务机制. 属性:4大属性: a.原子性:事务时一个完整的操作.b.一致性:当事务完成时,数据库必须处于一致状态.c.隔离性:对数据进行修改的所有并发事务时彼此隔离的.d.持久性:事务完成后,它对于系统的影响是永久性的. 创建 (1)开始事务:begin t

好记性不如烂笔头25-JAVA处理数据库事务(3) - 事务回滚点

在具体的工作中,有的事情需要被保持,不需要回滚,有的工作需要回滚,而这些逻辑,可以通过手动设置事务的回滚点. 1.用JAVA处理数据库事务的事务回滚点的准备 要有一个能够访问数据库的应用.下面的示例都基于ORACLE进行. create table ffm_account( id int primary key , name varchar(32), money int ); 测试数据: insert into ffm_account(id,name,money)values(1,'A',100

laravel数据库事务回滚

背景:近期使用Laravel-5.4进行项目开发时涉及到关联模型的数据操作,想到用事务回滚.中间涉及到数据引用及异常的捕获. 数据库事务回滚有两种方式:自动回滚.手动回滚. 举例如下: 自动回滚     function(Request $request){           DB::transaction(function () use ($request) {          try {            $admin = Admin::create(['name' => $requ

【MySQL】MySQL事务回滚脚本

MySQL自己的 mysqlbinlog | mysql 回滚不好用,自己写个简单脚本试试: 想法是用mysqlbinlog把需要回滚的事务区域从mysql-bin.file中找到,然后通过脚本再插入DB. ## INSERT 需要将新增数据删除 对应DELETE ## DELETE 需要将删除数据恢复 对应INSERT ## UPDATE 需要将修改数据恢复 对应UPDATE ## 手动读取BINLOG,并找到对应位置和对应事务 ## 手动删除除事务外的其他说明语句 INSERT回滚最简单,其

mysql事务回滚

mysql使用事务前需确定存储引擎为innodb,譬如删除一个人员数据,会删除和这个人有关的一些数据删除,这个时候就会用到事务,出现一个删除错误整个删除事务就会取消. 事务回滚步骤: /*创建roll表*/CREATE TABLE roll(    id int unsigned primary key auto_increment comment '主键',    names varchar(64) not null default '' comment '姓名')CHARSET =UTF8

MySQL(22):事务管理之 事务回滚

1. 在操作事务的时候,如果发现当前事务操作是不合理的,此时只要还没有提交事务,就可以通过回滚取消当前事务,接下来就针对事务的回滚进行详细讲解. 2. 为了演示回滚操作,在上一个笔记案例基础之上,此时a账户有1000元,b账户也有1000元,开启一个事务,通过update语句将a账户的100元转给b账户,具体语句,如下: start transaction; update account set money=money-100 where name='a'; update account set