事务

事务

什么是事务,事务的概念

  • 一件事情有n个组成单元 要不这n个组成单元同时成功 要不n个单元就同时失败

    就是将n个组成单元放到一个事务中

    ==》相当于 一组sql语句 事务可以确保这组sql语句要么全部成功,要不全部失败

  • JDBC会自动控制事务 自动开启事务(增删改的sql语句) 自动提交事务(commit) 事务提交后 数据永久保存在数据库里

  • 如果一个功能只需要一条sql语句 默认的自动提交事务 可以满足

  • 超过两条sql语句就无法满足 例如转账 需要多条SQL语句

    ​ 张三转出10000 update accout money=money-10000 where name=“张三” 自动开启事务 提交事务 commit

    • 出现异常 断电 张三钱少了 李四没收到钱
  • 李四收钱

    ​ 自动开启事务 update accout set money=money+10000 where name=“李四” 自动提交事务 commit

aga系统全局区
pga(用户内存)
plsq操作pga insert into 在pga保存  comity提交到aga 在写到dbf文件
tablespace 表空间  有n个xxx.dbf文件 create tablespace
  1. 手动开启事务 执行SQL语句1 SQL语句2 手动提交事务 commit

  2. 手动开启事务 执行SQL语句1 出现异常(停电) rollback(回滚) 撤销异常前所有成功的sql语句撤销 SQL语句2 手动提交事务 commit

  3. 手动控制事务需要jdbc模板 事务控制之和Connection对象有关

  4. Connextion conn=DriverManage.getConnection("url","user","pass");
    try{
        conn.setAutoCommit(flase)//改成手动提交事务  即手动开启了一个事务
        Sql-1;
        Sql-2;
        conn.commit();
    }catch(Exception ex){
        conn.rollback();
    }
    
  5. 多条SQL语句像在同一个事务里 必须共用同一个开启事务的connection

事务的特性和隔离级别

事务的四大特性(acid)

  • 原子性:事务中所有操作是不可再分割的原子单位,事务中所有的操作要不全部成功,要不全部失败
  • 一致性:事务执行后数据库状态与其他业务规则保持一致。如转账无论事务执行是否成功 两个转账账号余额之和是保持不变的
  • 隔离性:隔离性是指在并发操作中,不同事物之间应该隔离开来 使每个并发中的事务互不干扰
  • 持久性:一旦事务提交成功,事务中所有的数据操作必须被持久化到数据库中,即便提交事务后,数据库马上崩溃,在数据库重启时l 也必须能保证通过某种机制恢复数据。

事务的隔离级别

1.事务的并发读问题

  • 胀读: 读取到另一个事务未提交数据( 一个事务读取到了另一个事务未提交的数据 也就是读取到了胀读数据 发生胀读)
  • 不可重复读:(两次读取不一致 由于一个事务在运行过程中 另一个事务更新了记录 所以第一个事务对同一次记录的两次查询结果不一致 产生了不可重复读)
  • 幻读(虚读):读到另一事务已提交数据( 由于一个事务在运行过程中 另一个事务插入了新的记录,所以第一个事务对表的两次查询结果不一致 产生了幻读)
  • 不可重复读和幻读的区别:不可重复读是读取到了另一事务的更新,幻读是读取到了另一事务的插入(MySQL中无法测试到幻读);

2.四大隔离级别

  1. SERIALIZABLE(串行化)

    • l 不会出现任何并发问题,因为它是对同一数据的访问是串行的,非并发访问的;
    • l 性能最差;
  2. REPEATABLE READ(可重复读)(MySQL)

    • l 防止脏读和不可重复读,不能处理幻读问题;

    • l 性能比SERIALIZABLE好

  3. READ COMMITTED(读已提交数据)(Oracle)

    • l 防止脏读,没有处理不可重复读,也没有处理幻读;
    • l 性能比REPEATABLE READ好
  4. READ UNCOMMITTED(读未提交数据)

    • l 可能出现任何事务并发问题
    • l 性能最好
脏读 
事务1:张三给李四转账100元
事务2:李四查看自己的账户
    事务1:开始事务
    事务1:张三给李四转账100元
    事务2:开始事务
    事务2:李四查看自己的账户,看到账户多出100元(脏读)
    事务2:提交事务
    事务1:回滚事务,回到转账之前的状态
    
不可重复读
	事务1:酒店查看两次1048号房间状态
	事务2:预订1048号房间
    事务1:开始事务
    事务1:查看1048号房间状态为空闲
    事务2:开始事务
    事务2:预定1048号房间
    事务2:提交事务
    事务1:再次查看1048号房间状态为使用
    事务1:提交事务
    对同一记录的两次查询结果不一致!
    
幻读
	事务1:对酒店房间预订记录两次统计
	事务2:添加一条预订房间记录
    事务1:开始事务
    事务1:统计预订记录100条
    事务2:开始事务
    事务2:添加一条预订房间记录
    事务2:提交事务
    事务1:再次统计预订记录为101记录
    事务1:提交
  对同一表的两次查询不一致!
    
   不可重复读和幻读的区别:
不可重复读是读取到了另一事务的更新;
幻读是读取到了另一事务的插入(MySQL中无法测试到幻读)   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值