事务原理
2019-04-03 本文已影响0人
旦暮何枯
事务
事务是并发控制的基本单位,指作为单个逻辑工作单元执行的一系列操作,而这些逻辑工作需要满足 ACID 特性。
- ACID
- 原子性(Atomicity):事务是数据库逻辑工作单元,事务中包含的操作要么都执行成功,要么都执行失败。
- 一致性(Consistency):事务执行的结果必须是使数据库数据从一个一致性状态变到另外一种一致性状态。
- 隔离性(Isolation):一个事务的执行过程中不能影响到其他事务的执行,事务内部的操作及使用的数据对其他事务是隔离的,并发执行各个事务之间无不干扰。
- 持续性(Durability):即一个事务执一旦提交,它对数据库数据的改变是永久性的。之后的其它操作不应该对其执行结果有任何影响。
JDBC 的事务控制
Connection 对象下的三个方法实现对事务的控制。
setAutoCommit()
- 设置为 false,将所属 Connection 对象的后续语句作为 JDBC 事务进行处理,直到调用 commit() 方法。
- true 将所属对象的后续每个语句作为单独的 sql 语句进行处理(默认状态)。
commit()
提交事务,使事务中的所有 sql 生效。
rollback()
回滚事务- 回滚到事务开始之前的状态
conn = ds.getConnection();
// 开启事务
conn.setAutoCommit(false);
psta = conn.prepareStatement("update user set account = ? where name = ?");
psta.setInt(1, 0);
psta.setString(2, "Mike");
psta.execute();
psta.setString(1, "100");
psta.setString(2, "Bob");
psta.execute();
// 提交事务
conn.commit();
在事务未提交之前,所有的 sql 语句都不会执行。
设置检查点
setSavePoint()
设置数据库保存点,在出现异常后,可以回复到该点的状态
rollback(SavePoint savePoint)
回复方法
public void Transaction() {
Connection conn = null;
PreparedStatement psta = null;
ResultSet rs = null;
Savepoint sp = null;
try {
conn = ds.getConnection();
// 开启事务
conn.setAutoCommit(false);
psta = conn.prepareStatement("update user set account = ? where name = ?");
psta.setInt(1, 0);
psta.setString(2, "Mike");
psta.execute();
sp = conn.setSavepoint();
psta.setString(1, "100");
psta.setString(2, "Bob");
psta.execute();
// 提交事务
// conn.commit();
throw new SQLException();
} catch (SQLException e) {
try {
// 回滚事务到检查点
conn.rollback(sp);
psta.setString(1, "100");
psta.setString(2, "GuoSi");
psta.execute();
conn.commit();
} catch (SQLException ex) {
ex.printStackTrace();
}
// e.printStackTrace();
} finally {
try {
if (conn != null)
conn.close();
if (psta != null)
psta.close();
if (rs != null)
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
设置 JDBC 中的隔离级别
getTranactionIlsoLation()
setTranactionIlsoLation()
各个隔离级别内容在 MySQL 45讲 第三讲内容中