数据库——事务


前言


一、事务 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(开启)
            
  • 7
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值