MYSQL——事务

事务:

概念:是一组sql语句的集合,我们要完成一个数据操作的时候,可能需要通过多条sql完成,也就是说对数据库一个功能操作的整体叫做事务。

特性:ACID

  • 原子性:事务具有不可分割特性, 要么全部完成,要么全部不完成。
  • 一致性:事务开始到结束,数据库的完整性没有被破坏,结果要符合预期;基于原子性
  • 隔离性:防止事务并发执行时由于交叉执行而导致的数据不一致
  • 持久性:事务处理结束后,对数据的修改是永久的,即使系统故障也不会丢失

原子性&一致性的实现:可以通过加锁以及异常事务回滚操作完成,保证事务要么不做,要么一次性完成;

持久性:持久化存储(保证事务一旦完成将不可回滚)

事务的隔离性

隔离性:并发处理。

事物的并发处理会出现什么问题:脏写,脏读,不可重复性读,幻读

  • 脏读:读取到了其他事物还没有提交之后的修改结果
  • 不可重复读:一个事务在不同的时间,读取同一个数据得到不同的结果,我们就说这是不可重复读
  • 幻读:指同一个事务在不同时间段得到的结果条数不同

隔离级别: 

 Mysql数据库针对并发操作提供了四种隔离级别

  1. 读未提交--不加锁,什么问题都没解决
  2. 读已提交--解决不了脏读,依然存在不可重复读和幻读问题
  3. 可重复读--不加锁,解决了脏读,不可重复读,幻读的问题,基于mvcc
  4. 串行化--加锁,强制串行化执行,解决了所有问题

可重复读 

Mysql的默认隔离级别是可重复读;

可重复读的实现思想这个隔离级别解决不可重复读和幻读的原理---基于MVCC ---多版本并发控制

mvcc的实现思想

  1. 每张表中都有三个隐藏字段:DB_TRXID(创建该记录的事务ID),DB_ROW_ID(隐藏主键),DB_ROLL_PTR(回滚指针)
  2. mysql会为每个事务都生成一个事务ID,事务ID是持续增长的(越往后的事务,事务ID就越大)
  3. 新来的事务查询数据的时候,会交给他一份当前活跃的事务id数组--哪些事务未提交,新事务就会通过回滚指针,在undo日志中找寻已完成的事务的数据,然后取这个数据
  4. undo日志的删除是所有比自己大的事务都提交了才会删除掉

通过以上操作

辨别数据当前的操作事务是否已经提交,来决定是获取当前数据还是 从undo日志中获取比自己ID小已提交的事务数据,解决了不可重复读的问题;通过只获取比自己事务id小的事务的数据,来解决幻读的问题

 事务操作:

  • 开始事务:begin;
  • 保存事务回滚点:savepoint pos_name;
  • 提交事务:commit;
  • 回滚事务到指定的版本:rollback to pos_name;
  • 回滚事务:rollback;

下来自己再练练 !

事务未提交,随时都可以回滚,并且异常未完成事务,数据库在重启后也会自动回滚; 事务一旦提交根据持久性,数据将持久化存储,无法实现回滚;

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值