MySQL事务

1.事务的特点:

(1)原子性(Automicity) 原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。

(2)一致性(Consistency) 事务必须使数据库从一个一致性状态变换到另外一个一致性状态。

(3)隔离性(Isolation) 事务的隔离性是指一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。

(4)持久性(Durability) 持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来的其他操作和数据库故障不应该对其有任何影响

2.事务的隔离级别:

隔离级别:一个事务必须与由其他事务进行的资源或数据更改相隔离的程度。隔离级别从允许的并发副作用(例如,脏读或不可重复读,幻读)的角度进行描述

锁:在并发/多线程的操作中,会保证在同一时刻,只有一个线程进行操作,其他线程只能进行等待,

事务的隔离性是通过锁机制 实现的,不考虑隔离性会有三读一写的问题

  • 脏读:事务A读取到了事务B修改但还未提交的数据。

  • 不可重复读:事务A读取到了事务B修改但是已经提交的数据。对于事务A来说,前后两次查询同一个表的数据不同,这个不同是由其他事务修改引起的。

  • 幻读:事务A读取到了事务B添加、删除的数据结果。对于事务A来说,前后两次查询同一个表的数据记录数不同,这个记录数不同是由其他事务insert,delete引起的。

  • 丢失修改:对同一条数据修改时,后提交的事务A会覆盖事务B修改并已提交的记录,对于事务B来说再次查询此条数据时,会出现数据丢失修改的现象(自己修改的结果被后提交的事务A覆盖了)。

3.MySQL支持4 种事务隔离级别

数据库提供的 4 种事务隔离级别:

高低隔离级别描述
read-uncommitted允许A事务读取其他事务未提交和已提交的数据。会出现脏读、不可重复读、幻读问题
read-committed只允许A事务读取其他事务已提交的数据。可以避免脏读,但仍然会出现不可重复读、幻读问题
repeatable-read确保事务可以多次从一个字段中读取相同的值。在这个事务持续期间,禁止其他事务对这个字段进行更新。可以避免脏读和不可重复读。但是幻读问题仍然存在。注意:mysql中使用了MVCC多版本控制技术,在这个级别也可以避免幻读。
serializable确保事务可以从一个表中读取相同的行,相同的记录。在这个事务持续期间,禁止其他事务对该表执行插入、更新、删除操作。所有并发问题都可以避免,但性能十分低下。
  • MySQL的默认隔离级别是repeatable-read(可重复读)。

4.repeatable-read与serializable两个隔离级别的区别

  • repeatable-read:采用行锁机制。允许两个事务查看同一个表,修改同一个表的不同行,但是不允许修改同一个表的相同行。

  • serializable:采用表锁机制。如果serializable隔离级别的事务查看的A表,那么其他事务就不可以修改A表了。如果serializable隔离级别的事务没有查看A表,其他事务可以与它修改同一个表的不同行。

(二)MySQL事务日志

  • mysql数据库包含有很多种日志,比如慢查询日志,除此之外,还有一种重要日志,事务日志,包含redo日志undo日志

  • 事务:要么都成功,如果有一个失败,所有都失败

  • 事务主要两个操作:事务提交 和 事务回滚

  • 目前事务日志保证:保证事务提交和回滚的

  • redo日志保证事务提交的,undo日志保证事务回滚的

  • 事务的原子性、一致性和持久性由事务的 redo日志undo日志来保证

1.redolog

保证事务提交,事务持久性的保证

redo日志流程:

--执行--缓存--更新--日志--更新--

Innodb引擎采用的是WAL技术(write-ahead logging) , 这种技术就是先写日志,再写磁盘,只有日志写入成功,才算事务提交成功,这里的日志就是redo log。通俗来讲,就是 MySQL 的写操作并不是立刻更新到磁盘上,而是先记录在日志上,然后在合适的时间再更新到磁盘上

  • 第一步 执行sql语句,添加、修改或者删除

  • 第二步 把磁盘文件数据放到缓存里面(内存中)

  • 第三步 更新数据,但是不是去更新文件数据,更新缓存里面数据

  • 第四步 缓存数据更新完成之后,把修改数据放到redo日志里面

  • 第五步 把更新数据写到redo日志里面之后,定期把内存数据更新到硬盘文件里面

刷盘策略有三个值:0 、1(默认值)、 2

1:每次提交事务都将进行同步,数据安全性较高,性能稍差

0:每隔1s进行更新,性能最佳,数据风险较高

2:由os操作系统自己决定什么时候更新

磁盘文件刷新之后,会删除redolog中的记录

2.undolog

  • 保证事务回滚,记录对数据库修改操作的逆操作,事务原子性的保证

  • 在事务中更新数据前置操作其实是要先写入一个undo log。

  • insert undo log:日志记录可删

  • update undo log:日志记录不会删除

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值