MYSQl-事务

一、什么是事务

简单点说,就是一堆sql逻辑排列在一起,要么全部执行,要么都不执行。只有InnoDB存储引擎才支持事务(SHOW ENGINES;)

二、如何开启一个事务

show VARIABLES LIKE '%autocommit%' 查看是否已经开启自动提交,如果为YES,那么每执行一条sql都会自动创建一个事务并提交

如果为NO,那么需要手动开启和提交事务

begin

   sql....

commit or rollback

 

三、事务的性质(ACID)

  • 原子性:一个事务是最小的不可分割单元,要么全部执行,要么都不执行(通过undolog实现)。
  • 一致性:事物执行前后,数据的状态是一致的(redolog实现)。(例如A给B转账100元,执行后A要少100元,B要多100元)
  • 隔离性:事务与事务之间,互相感知不到对方的存在,互不影响(通过锁+mvcc实现)。
  • 持久性:事务一旦提交,将永久生效。后续操作将对其不产生影响(通过redolog实现,在commit之前先写redolog)。

四、事物隔离级别(并发的两个或多个事务)

  • 读未提交 事务A能够读取到未提交事务B对数据做出的修改
  • 读提交    事务A不能读取到未提交事务B对数据的修改,但如果事物B提交,事物A就能读到
  • 可重复读 事务A不能读取到未提交事务B对数据的修改
  • 串行化    事务A、B排队执行,完全互不影响

五、事务并发能产生的问题

  • 脏读 事务A读取到了事物B未提交的数据,然后事物B回滚了,这个数据就是脏数据。
  • 不可重复读 事务A重复执行相同条件的sql,查出来记录结果不一样。 读取到了事物B提交的数据
  • 幻读 事务A重复执行相同条件的sql,查出来记录条数不一样。读取到了事物B提交的数据

六、四种隔离级别下存在的问题(1代表有可能)

  脏读 不可重复读 幻读
读未提交 1 1 1
读提交 0 1 1
可重复读 0 0 1
串行化 0 0 0
posted @ 2022-03-01 15:33  hugeQAQ  阅读(27)  评论(0编辑  收藏  举报