JDBC事务处理
简单概念:要么都成功,要么都失败
ACID原则:保证数据的安全
开启事务
事务提交 commit()
事务回滚 rollback()
关闭事务
转账:
A:1000
B:1000
A(900) ---100--> B(1100)
Junit单元测试
依赖
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
</dependency>
简单实用
@Test注解只有在方法上有效,只要加了这个注解的方法,就可以直接运行!
import org.junit.Test;
public class JdbcACID {
@Test
public void T() {
System.out.println("SUCCESS!!!!!");
}
}
新建表并插入数据
CREATE TABLE `account`(
`id` INT PRIMARY KEY,
`name` VARCHAR(50) NOT NULL,
`money` FLOAT NOT NULL
) ENGINE=INNODB DEFAULT CHARSET=utf8
INSERT INTO `account` (`id`, `name`, `money`) VALUES(1,'A',1000);
INSERT INTO `account` (`id`, `name`, `money`) VALUES(2,'B',1000);
INSERT INTO `account` (`id`, `name`, `money`) VALUES(3,'C',1000);
# 开启事务
start transaction ;
# 模拟转账
update account set money=money-100 where name='A';
update account set money=money+100 where name='B';
# 回滚
rollback ;
# 提交
commit;
测试代码(制造异常事件)
@Test
public void T(){
//获取配置信息
//解决中文乱码
String url="jdbc:mysql://localhost:3306/jdbc?useUnicode=true&characterEncoding=utf-8";
String username="root";
String password="6113081";
//提出对象
Connection connection=null;
//1.加载驱动
try {
//1.加载驱动
Class.forName("com.mysql.jdbc.Driver");
//2.链接数据库,其对象就代表了数据库(不安全)
connection = DriverManager.getConnection(url, username, password);
//通知数据库开启事务false开启true是关闭
connection.setAutoCommit(false);
//预编译开启安全的数据库连接,进行数据库操作
String sql1="update account set money=money-100 where name='A'";
connection.prepareStatement(sql1).executeUpdate();
//此时制造错误
int i=1/0;
String sql2="update account set money=money+100 where name='B'";
connection.prepareStatement(sql2).executeUpdate();
//提交事务
connection.commit();//以上两条sql都提交成功就会提交事务,否则进入catch语句执行回滚
System.out.println("SUCCESS!!!!!!");
} catch (Exception e) {
try {
//出现异常事务提交终止,回滚数据
connection.rollback();
} catch (SQLException ex) {
ex.printStackTrace();
}
e.printStackTrace();
}finally {
//关闭连接释放资源(一定要做)先开的后关
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
输出结果
数据库变化
测试代码(消除异常事件)
@Test
public void T(){
//获取配置信息
//解决中文乱码
String url="jdbc:mysql://localhost:3306/jdbc?useUnicode=true&characterEncoding=utf-8";
String username="root";
String password="6113081";
//提出对象
Connection connection=null;
//1.加载驱动
try {
//1.加载驱动
Class.forName("com.mysql.jdbc.Driver");
//2.链接数据库,其对象就代表了数据库(不安全)
connection = DriverManager.getConnection(url, username, password);
//通知数据库开启事务false开启true是关闭
connection.setAutoCommit(false);
//预编译开启安全的数据库连接,进行数据库操作
String sql1="update account set money=money-100 where name='A'";
connection.prepareStatement(sql1).executeUpdate();
//此时制造错误
//int i=1/0;
String sql2="update account set money=money+100 where name='B'";
connection.prepareStatement(sql2).executeUpdate();
//提交事务
connection.commit();//以上两条sql都提交成功就会提交事务,否则进入catch语句执行回滚
System.out.println("SUCCESS!!!!!!");
} catch (Exception e) {
try {
//出现异常事务提交终止,回滚数据
connection.rollback();
} catch (SQLException ex) {
ex.printStackTrace();
}
e.printStackTrace();
}finally {
//关闭连接释放资源(一定要做)先开的后关
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
输出结果
数据库变化
本文来自博客园,作者:Cn_FallTime,转载请注明原文链接:https://www.cnblogs.com/CnFallTime/p/15982484.html