JDBC的事务管理
1 事务的四个特性
事务代表一个工作单元。
事务管理有四个特性ACID。ACID代表原子性,一致性,隔离性和持久性。
- 原子性:意味着全部成功或没有成功。
- 一致性:确保将数据库从一种一致状态带到另一种一致状态。
- 隔离:确保事务与其他事务隔离。
- 持久性:是指一旦事务已提交,即使在发生错误,断电等情况下,事务也将保持不变。
2 事务的好处
提交性能:由于事务提交时命中了数据库,因此可以提高性能。
3 JDBC事务管理的方法
在JDBC中,Connection接口提供了管理事务的方法。
方法 | 说明 |
---|---|
void setAutoCommit(boolean status) | 设置事务是否自动提交。默认情况下为true,表示每个事务均提交。 |
void commit() | 提交事务。 |
void rollback() | 回滚事务。 |
4 使用Statement进行JDBC事务管理
4.1 编写测试类
StmtDemo:
package com.yiidian;
import java.io.*;
import java.sql.*;
/**
* 一点教程网 - http://www.yiidian.com
*/
public class StmtDemo {
public static void main(String args[])throws Exception {
try {
Class.forName("com.mysql.jdbc.Driver");
Connection con = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/test", "root", "root");
//开启事务
con.setAutoCommit(false);
Statement stmt=con.createStatement();
stmt.executeUpdate("insert into t_user(username,password) values('eric','123')");
stmt.executeUpdate("insert into t_user(username,password) values('jack','123')");
//提交事务
con.commit();
con.close();
}catch(Exception e){
System.out.println(e);
}
}
}
4.2 运行测试
会看到t_user表多了两条记录
5 使用PreparedStatement进行JDBC事务管理
5.1 编写测试类
PsmtDemo:
package com.yiidian;
import java.io.*;
import java.sql.*;
/**
* 一点教程网 - http://www.yiidian.com
*/
public class PsmtDemo {
public static void main(String args[])throws Exception {
try {
Class.forName("com.mysql.jdbc.Driver");
Connection con = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/test", "root", "root");
//开启事务
con.setAutoCommit(false);
PreparedStatement ps=con.prepareStatement("insert into t_user(username,password) values(?,?)");
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
while(true){
System.out.println("请输入名称:");
String name=br.readLine();
System.out.println("请输入密码:");
String password=br.readLine();
ps.setString(1,name);
ps.setString(2,password);
ps.executeUpdate();
System.out.println("提交(commit)/回滚(rollback)事务");
String answer=br.readLine();
if(answer.equals("commit")){
//事务提交
con.commit();
}
if(answer.equals("rollback")){
//事务回滚
con.rollback();
}
System.out.println("想要继续添加记录么 y/n");
String ans=br.readLine();
if(ans.equals("n")){
break;
}
}
//提交事务
con.commit();
System.out.println("保存成功");
con.close();
}catch(Exception e){
System.out.println(e);
}
}
}
5.2 运行测试
最后表中只插入了eric,而没有jack的记录(因为jack数据回滚了)
热门文章
优秀文章