目录
1. 数据库事务
1.1 概念
事务:一组逻辑操作,使数据从一种状态变换到另一种状态。组成这组操作的各个单元要
么全部成功,要么全部失败。在开发者看来,此动作最终表现为一条或多条SQL语句
1.2 事务处理(事务操作)
保证所有事务都作为一个工作单元来执行,即使出现了故障,都不能改变这种执行
方式。当在一个事务中执行多个操作时,要么所有的事务都被提交(commit),那么这些
修改就永久地保存下来;要么数据库管理系统将放弃所作的所有修改,整个事务回滚
(rollback) 到最初状态
为确保数据库中数据的一致性,数据的操纵应当是离散的成组的逻辑单元: 当它全部
完成时,数据的一致性可以保持,而当这个单元中的一部分操作失败,整个事务应全部视为
错误,所有从起始点以后的操作应全部回退到开始状态。
1.3 SQL 使用事务
(1)start transaction; 开启事务
(2)执行属于这个事务的 SQL
(3)rollback / commit; 回滚即全部失败
提交即全部成功,明确告诉一个事务已完成
(4)savepoint 保存点,一个事务中可以有多个 savepoint;
注:
事务只有一条 SQL 语句,可省略事务开启与提交
2. JDBC事务处理
2.1 一次开启的事务只与一条连接(Connection)有关
2.2 当一个连接对象被创建时,默认情况下是自动提交事务:每次执行一个 SQL 语句时,如果
执行成功,就会向数据库自动提交,而不能回滚
2.3 为了让多个 SQL 语句作为一个事务执行:
• 调用 Connection 对象的 setAutoCommit(false); 以取消自动提交事务
• 在所有的 SQL 语句都成功执行后,调用 commit(); 方法提交事务
• 在出现异常时,调用 rollback(); 方法回滚事务
• 若此时 Connection 没有被关闭, 则需要恢复其自动提交状态
2.4 事务处理过程
(1)有事务且commit(手动)
执行结果:数据正常提交
public class Demo1 {
public static void main(String[] args) throws SQLException {
String sql1 = "insert into records (rid, bid) values (1, 1)";
String sql2 = "update books set count = count - 1 where bid = 1";
// 使用事务,意味着多条 SQL 语句必须在一条 Connection 下完成
// Connection 中有一个自动提交(AutoCommit)属性,默认情况下为 true(开启状态)