事务,并发访问,隔离等相关问题

事务定义:

在一组业务逻辑(ABCD)操作中, 要么全部成功, 要么全部失败

事务特性: ACID

原子性: 事务是一个不可分割的整体

一致性: 事务的操作前后, 数据保持一致 (完整)

隔离性: 两个事务的并发问题 (是一个问题需要解决)

持久性: 事务一旦提交就不能回滚

并发访问问题:(隔离问题)

脏读: 一个事务读到了另一个事务没有提交的数据

不可重复读: 一个事务读到了另一个事务已经提交的数据(发生在:更新 update)

虚读 / 幻读: 一个事务读到了另一个事务已经提交的数据(发生在: 添加 insert) -- 纯理论(因为这种问题在内部已经解决了)

隔离级别: 用于解决隔离问题

1. 读未提交级别: 一个事务读到了另一个事务没有提交的数据,

                      存在3个问题: 脏读,不可重复读,虚读

2. 读已提交级别: 一个事务读到了另一个事务已经提交的数据,

                      解决1个问题 : 脏读, 存在2个问题: 不可重复读,虚读

3. 可重复读级别: 一个事务中, 多次读取的数据是重复的,

                      解决2个问题 : 脏读,不可重复读, 存在1个问题:幻读

4. 串行化级别: 一次执行一个事务 (单事务)(各执行各的)

常见数据库默认隔离级别:

mySQL: 默认级别: 可重复读

oracle: 默认级别: 读已提交

性能和安全: 

性能:  读未提交级别 > 读已提交 > 可重复读 > 串行化

安全:  读未提交级别 < 读已提交 < 可重复读 < 串行化

mysql事务演示:(cmd中)

# 开启事务
mysql> start transaction;
mysql> 更新语句付款;
mysql> 更新语句收款;
#操作1:提交
mysql> commit;
#操作2:回滚
mysql> rollback;

jdbc事务演示:

//获得连接
Connection conn = null;
try {
    //1 开始事务 (自动提交关闭)
    conn.setAutoCommit(false);

    // 操作
    // 更新语句付款;
    // 更新语句收款;

    //2 提交事务
    conn.commit();
} catch (Exception e) {
    //3 回滚事务
    conn.rollback();
} finally {
    //4 释放资源
    conn.close();
}

MyBatis事务操作:

SqlSession sqlSession = null;
try {
    //1 开始事务,默认关闭自动提交,言外之意开启事务

    // 操作
    // 更新语句付款;
    // 更新语句收款;

    //2 提交事务
    sqlSession.commit();
} catch (Exception e) {
    //3 回滚事务
    sqlSession.rollback();
} finally {
    //4 释放资源
    sqlSession.close();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值