目录
前言
在并发下事务会容易出现一些问题:
脏读 :一个事务开始读取了某行数据,另外一个事务已经更新了此数据但没有能够及时提交。这是相当危险的,因为很可能所有的操作都被回滚。(别人一修改,我这边就体现了)
不可重复读:一个事务对同一行数据重复读取两次,但是却得到了不同的结果。例如,在两次读取的中途,有另外一个事务对该型数据进行了修改,并提
交。(别人修改提交了,影响了我这边,比如第一次结果是A,第二次是B,因为别人把A改成B并且提交了)
幻读:事务在操作过程中进行两次查询,第二次查询的结果包含了第一次查询中未出现的数据(SQL不一定一样)。(就是两个事务都先查询,不存在就插入,结果插入的是同一条,就报错了,所以就是某个事务查询的时候加个排它锁就能解决了!)
这是因为在两次查询过程中有另外一个 事务插入数据 在MySQL中存在(InnoDB)事务存在着4中隔离级别,不同的隔离级别对事务的处理不同。
未授权读取(未提交读 Read Uncommitted):READ-UNCOMMITTED | 0:存在脏读,不可重复读,幻读的问题。如果一个事务已经开始写数据,则另外一
个数据则不会允许同时进行写操作,但允许其他事务读此行数据。隔离级别可以通过“排他写锁”实现。
授权读取(已读提交 Read committed):READ-COMMITTED | 1:解决脏读的问题,存在不可重复读,幻读的问题。这个可以通过“排他写锁”实现。读取数
据的事务允许其他事务继续访问该行数据,但是未提交的写事务将会禁止其他事务访问该行。
可重复读取(Repeatable Read):REPEATABLE-READ | 2:解决脏读,不可重复读的问题,存在幻读的问题,默认隔离级别。可通过“共享锁”,“排他锁”实
现。读取数据的事务将会禁止写事务(但允许读事务),写事务则禁止任何其他事务。
序列化(Serializable):SERIALIZABLE | 3:解决脏读,不可重复读,幻读,可保证事务安全,但完全串行执行,性能最低。提供严格的事务隔离。它要求事
务序列化执行,事务只能一个接着一个地执行,不能并发执行。如果仅仅通过“行级锁”是无法实现事务序列化的,必须要通过其他机制保证新插入的数据不
会被刚执行查询操作的事务访问到。

innodb默认RR,保持就好,但是要解决幻读问题(加排它锁解决)(mysql8已经解决,之前的版本注意一下)
事务还要注意两个日志
重做日志与回滚日志
到现在为止我们了解了 MySQL 中的两种日志,回滚日志(undo log)和重做日志(redo log);在数据库系统中,事务的原子性和持久性是由事务日志
(transaction log)保证的,在实现时也就是上面提到的两种日志,前者用于对事务的影响进行撤销,后者在错误处理时对已经提交的事务进行重做,它们能保
证两点:事务与锁基础.md to 事务与锁基础.pdf by MARKDOWN-THEMEABLE-PDF
Page 14/14 © Copyright Wednesday, Mar 18, 2020, 4:57 PM by COMPANYNAME
1. 发生错误或者需要回滚的事务能够成功回滚(原子性);
2. 在事务提交后,数据没来得及写会磁盘就宕机时,在下次重新启动后能够成功恢复数据(持久性); 在数据库中,这两种日志经常都是一起工作的,我们
可以将它们整体看做一条事务日志,其中包含了事务的 ID、修改的行元素以及修改前后的值。
本文介绍了并发下MySQL事务的常见问题,如脏读、不可重复读和幻读,重点讲解了四种隔离级别及其应用。同时,详细阐述了InnoDB默认的Repeatable Read隔离级别,以及如何通过排他锁处理幻读。文章还涵盖了重做日志和回滚日志的作用,确保事务的原子性和持久性。
6569

被折叠的 条评论
为什么被折叠?



