事务(Transaction,简写为tx):在数据库中,事务是指一组逻辑操作,不论成功与失败都作为一个整体进行工作,要么全部执行成功,要么全部不执行(执行失败)。
1、处理事务的两个动作
1)提交(commit):在整个事务中,所有的逻辑操作都正常执行成功,则提交事务。
2)回滚(rollback):在整个事务中,有一个或多个逻辑操作执行失败,则回滚事务,撤销该事务中的所有操作,恢复到最初的状态。
2、事务的ACID属性
1)原子性(Aromicity):事务是应用中不可再分的最小逻辑执行单位,要么都执行成功,要么都不执行。
2)一致性(Consistency):事务结束后,数据库中的数据是合法正确的(数据不被破坏)。
3)隔离性(Isolation):并发执行的事务之间彼此相互独立、互不干扰。
4)持久性(Durability):事务提交后,数据时永久性对的、不可回滚。
3、在代码中处理事务
1)在JDBC中缺省情况下,事务是自动提交的,控制事务必须先设置事务为手动提交
2)手动提交事务
3)若出现异常必须回滚事务
Connection接口方法:
-
-
void
setAutoCommit(boolean autoCommit)
将此连接的自动提交模式设置为给定状态。
void
commit()
使自上次提交/回滚以来所做的所有更改都将永久性,并释放此
Connection
对象当前持有的任何数据库锁。void
rollback()
撤消在当前事务中所做的所有更改,并释放此
Connection
对象当前持有的任何数据库锁。
-
/**
* 赵云向赵子龙转账1000
*/
@Test
public void testTx() {
Connection conn = JdbcUtil.getConnection();
PreparedStatement ps = null;
ResultSet rs = null;
try {
//1、设置事务手动提交
conn.setAutoCommit(false);
//查询赵云账号余额
String sql = "SELECT * FROM t_user WHERE username=? and account >=?";
ps = conn.prepareStatement(sql);
ps.setString(1,"赵云");
ps.setLong(2,1000L);
rs = ps.executeQuery();
if (!rs.next()){
throw new RuntimeException("余额不足!");
}
//赵云减1000
sql = "UPDATE t_user set account=account-? WHERE username=?";
ps = conn.prepareStatement(sql);
ps.setLong(1,1000L);
ps.setString(2,"赵云");
ps.executeUpdate();
//模拟异常
int i = 1/0;
//赵子龙加1000
sql = "UPDATE t_user set account=IFNULL(account,0) +? WHERE username=?";
ps = conn.prepareStatement(sql);
ps.setLong(1,1000L);
ps.setString(2,"赵子龙");
ps.executeUpdate();
//2、手动提交事务
conn.commit();
}catch (Exception e){
e.printStackTrace();
try {
//3、回滚事务
conn.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
}finally {
JdbcUtil.close(conn, ps, rs);
}
}
二、批处理操作
批量操作(batch):当需要成批插入或者更新记录时,可以采用Java的批量更新机制,它允许多条语句一次性提交为数据库批量处理。通常情况下比单独提交处理更高效。
JDBC的批量处理语句的方法:
1、Statement接口批处理
一次性可以执行多条SQL语句,需要编译多次。
-
-
void
addBatch(String sql)
将给定的SQL命令添加到此
Statement
对象的当前命令列表中。int[]
executeBatch()
将一批命令提交到数据库以执行,并且所有命令都执行成功,返回一个更新计数的数组。
void
clearBatch()
清空此
Statement
对象的当前SQL命令列表。
-
/**
* Statement 未使用批量处理
* InnodDB耗时:6111ms
* 添加rewriteBatchedStatements=true后
* InnodDB耗时:6042ms
* @throws Exception
*/
@Test
public void testSaveByStatement() throws Exception {
long begin = System.currentTimeMillis();
Connection conn = JdbcUtil.getConnection();
Statement st = null;
for (int i = 0; i
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?