事务

  1. 事务保存点(oracle):savepoint

    复杂业务操作中,在核心业务之后添加事务保存点
    insert into person values (1, 'a', 1);
    insert into person values (2, 'b', 0);
    commit;
    
    update person set pname='c' where pid=1;
    savepoint a1;
    update person set pname='d' where pid=2;
    rollback to a1;
    commit;
  2. 事务的四大特性:ACID

    原子性:事务是一个不可分割的工作单元,事务中的操作要么全都发生,要么全都不发生;
    一致性:事务前后数据的完整性必须保持一致;
    隔离性:并发执行的事务彼此无法看到对方的中间状态;
    持久性:一个事务一旦被提交,它对数据库数据的改变就是永久性的,即使数据库发生故障也不应该对其有任何影响。
            通过日志和同步备份可以在故障发生后重建数据。

  3. 并发访问问题

    脏读:一个事务读到了另一个事务未提交的数据
    不可重复读:一个事务读到另一个事务已经提交(update)的数据。引发另一个事务,在事务中的的多次查询结果不一致
    虚读/幻读:一个事务读到了另一个事务已经提交(insert)的数据。引发另一个事务,在事务中的多次查询结果不一致

  4. 隔离级别:解决问题

    读未提交:一个事务读到了另一个事务没有提交的数据
              存在脏读、不可重复读、虚读
              在T线程操作时,其他线程可以进来做增删改操作,但事务不提交,其他线程可以看到T线程操作后的数据
    读已提交:一个事务读到了另一个事务已经提交的数据
              存在不可重复读、虚读,解决了脏读
              在T线程操作时,其他线程可以进来做增删改操作,但事务不提交,其他线程看不到T线程操作后的数据
    可重复读:在一个事务中读到的数据始终保持一致,无论另一个事务是否提交
              存在虚读,解决了脏读,不可重复读
              在T线程操作时,其他线程可以进来,但只能做增删操作
    序列化:同时只能执行一个事务,相当于事务中的单线程
              解决了脏读、不可重复读、虚读
              永远单线程,永远线程安全,但是效率低

    oracle中支持读已提交、可重复读、序列化三种事务隔离级别
    oracle默认隔离级别:读已提交
    mysql中支持读未提交、读已提交、可重复读、序列化四种事务隔离级别
    mysql默认隔离级别:可重复读

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值