一.事务
事务就是一个操作,在操作中包含多步,事务能保证多步操作要么都执行,要么都不执行
mysql数据库中,默认认为每一条 insert或update 或delete语句都是一个事务,默认的事务无法“撤销” 、无法回滚
关键语句:
- 1.
con.setAutoCommit(false);
设置不默认提交事物 - 2.
con.commit();
程序最后再提交事物
事物的特点:(事务中的语句一定是增删改语句)
- 1、原子性:事务中的语句是最小单位,不能再分割
- 2、隔离性:事务和事务之间是隔离的,没有任何关系
- 3、一致性:事务中的若干条语句,要么都执行,要么都不执行
- 4、永久性:事务一旦提交后,将无法回滚。
案例:
银行的转账业务
包括两步操作:
- 账户1:
update account set balance=balance-500 where id="1"
- 账户2:
update account set balance=balance+500 where id="2"
代码:
package cn.jdbc.text;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
/**
* @author CC
* 事物
* 只能是增,删,改语句
*/
public class ThingsTest {
public static void main(String[] args) {
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
Connection con = null;
PreparedStatement pstm = null;
try {
con = DriverManager.getConnection("jdbc:mysql://localhost:3306/day7","root","cuichen975541045");
con.setAutoCommit(false);
//账号减少
String sql = "update bankaccount set balance=balance-500 where id='1001'";
pstm = con.prepareStatement(sql);
pstm.executeUpdate();
//账户增加
String sql2 = "update bankaccount set balance = balance+500 where id='1002'";
pstm = con.prepareStatement(sql2);
pstm.executeUpdate();
con.commit();
} catch (SQLException e) {
e.printStackTrace();
try {
con.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
System.out.println("提交失败");
}
}
}
二.批量操作数据( 一次执行多条 insert update delete 语句)
关键语句:
pstm.addBatch();
增加批次pstm.executeBatch();
执行批次代码pstm.clearBatch();
清除批次
代码:
package cn.jdbc.text;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
/**
* @author CC
* 批处理
*/
public class BatchAdd {
public static void main(String[] args) {
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
Connection con = null;
PreparedStatement pstm = null;
try {
con = DriverManager.getConnection("jdbc:mysql://localhost:3306/day7","root","cuichen975541045");
String sql = "insert into batchadd(name,mark) values(?,?)";
pstm = con.prepareStatement(sql);
//批量插入
for (int i = 1; i <= 50000; i++) {
pstm.setString(1, "第"+i);
pstm.setString(2, "注释"+i);
//增加批次
pstm.addBatch();
if (i%100 == 0) {
pstm.executeBatch();
pstm.clearBatch();
}
}
//执行批次代码
pstm.executeBatch();
} catch (SQLException e) {
e.printStackTrace();
}
}
}