1、首先创建一个测试表
create table account(
id int primary key auto_increment,
name varchar(40),
money float
);
insert into account(name,money) values('A',1000);
insert into account(name,money) values('B',1000);
insert into account(name,money) values('C',1000);
2、编辑事务测试类TransactionTest,需要注意以下四点:
(1)对数据库进行操作前,关闭数据库自动提交,同时会自动开启事务:
cn.setAutoCommit(false);
(2)操作完成需要提交事务:
cn.commit();
(3)两次操作中手动设置一个异常,测试事务是否设置成功,会发现异常之前的操作没有改变数据库:
int x = 1/0;
(4)最好在catch异常中手动显示添加一段异常回滚操作(虽然失败自动回滚,可以省略):
cn.rollback();
以下是完整的TransactionTest类代码:
package com.jdbc;
import com.utils.JdbcUtils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class TransactionTest {
public static void main(String[] args) {
Connection cn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
cn = JdbcUtils.getConnection();
//关闭数据库的自动提交,会自动开启事务
cn.setAutoCommit(false);//关闭数据库自动提交同时自动开启事务
String sql1 = "update account set money = money - 100 where name = 'A';";
ps = cn.prepareStatement(sql1);
ps.executeUpdate();
int x = 1/0;
String sql2 = "update account set money = money + 100 where name = 'B';";
ps = cn.prepareStatement(sql2);
ps.executeUpdate();
//业务完成,提交事务
cn.commit();
System.out.println("成功");
} catch (SQLException e) {
try {
cn.rollback(); //如果失败进行回滚,其实也可以省略此句,因为失败即回滚
} catch (SQLException ex) {
ex.printStackTrace();
}
e.printStackTrace();
} finally {
JdbcUtils.release(cn,ps,rs);
}
}
}