前言
一、事务 Transaction
1、概念
1.指向含义广泛,并不一定是特指数据库中的事务处理
2.狭义上:在业务方(开发者)看来,是一个不可再分的业务动作,这个动作可能是一条或者多条SQL语句
二、事务的ACID特性
相对来是这四个不是平级关系:
1、如何使用事务:一致性
我们(开发人员)和DBMS之间进行数据交换
DBMS不知道SQL是怎么划分成不同事务的
1.1第一角度:SQL怎么使用事务
1.1.1start transaction;…commit;
-- 重点看原子性即可
-- 只要在事务中,这两条 sql,谁先谁后不重要
start transaction;
insert into records (rid, bid) values (1, 2); -- 添加了一条借阅记录
-- 模拟数据库服务器挂掉了(通过重启的方式)
update books set count = count - 1 where bid = 2; -- 修改书籍存量
-- rollback; 主动让事务失败
commit; -- 提交事务,代表事务完成(只有这个完成之后,数据修改才真正地落盘(持久化到硬盘上))
1.1.2 rollback及保存点
1.2第一角度:通过JDBC方式使用事务
通过4个场景进行演示:
1.有事务,commit——Demo1
2.没有事务,被动失败(重启服务器)——Demo2
3.有事务,被动失败(重启服务器)(程序导致)——Demo3、Demo4
4.有事务,主动失败(rollback)——Demo5
1.2.1有事务,commit
关闭connection中的自动提交,才能使多个SQL语句成为一个事务。
由于我们关闭了自动提交了,所以所有的修改还没有真正地落盘
只有加上这句话: c.commit(); 才表示事务被提交了(数据真正落盘了)
public class Demo1 {
public static void main(String[] args) throws SQLException {
String sql1 = "insert into records (rid, bid) values (1, 2)";
String sql2 = "update books set count = count - 1 where bid = 2";
// 要使用事务,在同一个事务中,操作 sql1 和 sql2,意味着必须在一条 Connection 完成
try (Connection c = DBUtil.connection()) {
// connection 中有一个 自动提交(autocommit)的属性,默认情况下,是 true(开启)