Mysql中事务介绍

一. 事务的概念
在百度上事务的概念是指数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作构成。
我觉得事务就是当你要完成一个对数据库数据的操作时候,可能一条sql语句完成不了,想要使用多条sql语句一起完成,而且这几条sql语句一定要都执行成功对数据库的修改或者对数据库数据修改都执行失败的一个事件。就例如你要在一个平台上注销你的账号,那么关于你账号的所有数据都需要删除,同时涉及好多张表,然后这个做这些操作的sql语句就是一个事务。这个事件要么就是把你的账号注销同时把你的所有有关数据删除,要么就是注销不成功,你的数据也没有删除。不能是账号注销没成功,你的数据删除了;也不可以是账号注销了,你的数据没删除。

二.事务的特性(ACID)
原子性(Atomicity):事务中的所有操作要像原子一样不可分割,要么全部执行成功,要么全部执行失败,通过undo log实现
一致性(Consistenay):事务的执行结果必须使数据库的一致性状态到另一个一致性状态。例如转账签后两个账户的金额总合是一样的
隔离性(Isolation):并发执行的事务不会互相影响。通过mvcc+读写锁实现
持久性(Durablity):事务一旦提交,对数据库的更新是持久的。任何事务或系统的更新都不会导致数据的丢失,通过 redo log实现

其实事务中的其它三个特性都是为要完成一致性的要求。

会对一致性造成破坏的条件:
1.事务的并发执行
2.事务故障或系统故障

数据库系统通过并发控制技术和日志恢复技术来避免这些情况的发生
并发控制技术保证了事务的隔离性,使数据库的一致性不会因为并发执行而遭到破坏
日志恢复技术保证了事务的原子性,使一致性不会因为事务故障或者系统故障而遭到破坏。同时使已提交的对数据的修改不会因为系统崩溃而丢失,保证了事务的持久性

原子性实现原理 : Undo log
Undo log是为了实现事务的原子性,在数据库的InnoDB存储引擎中
在进行任何操作之前,会将数据备份到另一个地方(这个存储数据备份的地方称为Undo log)。然后进行数据修改,如果出现错误或者用户执行了RollBACK语句,系统可以利用Undo log中备份将数据恢复到事务开始之前的状态
注意:Undo log是逻辑日志
当delete一条数据时,Undo log中记录一条对应的insert数据
当insert一条数据时,Undo log中记录一条对应的delete数据
当update一条数据的时候,它记录一条反向的update数据

持久性实现原理:Redo log
和Undo log相反的是Redo log是记录新数据的备份。在事务提交之前,只要将Redo log持久化就好了,不需要将数据持久化。当系统崩溃的时候,虽然数据没有持久化,但是Redo log已经持久化了。系统可以根据Redo log的内容,将所有数据恢复到最新的状态。

三.事务并发带来的问题
脏读(Dirty read): 当一个事务正在访问数据并且对数据进行了修改,而这种修改还没有提交到数据库中,这时另外一个事务也访问了这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据,那么另外一个事务读到的这个数据是“脏数据”,依据“脏数据”所做的操作可能是不正确的。
丢失修改(Lost to modify): 指在一个事务读取一个数据时,另外一个事务也访问了该数据,那么在第一个事务中修改了这个数据后,第二个事务也修改了这个数据。这样第一个事务内的修改结果就被丢失,因此称为丢失修改。 例如:事务1读取某表中的数据A=20,事务2也读取A=20,事务1修改A=A-1,事务2也修改A=A-1,最终结果A=19,事务1的修改被丢失。
不可重复读(Unrepeatableread): 指在一个事务内多次读同一数据。在这个事务还没有结束时,另一个事务也访问该数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改导致第一个事务两次读取的数据可能不太一样。这就发生了在一个事务内两次读到的数据是不一样的情况,因此称为不可重复读。
幻读(Phantom read): 幻读与不可重复读类似。它发生在一个事务(T1)读取了几行数据,接着另一个并发事务(T2)插入了一些数据时。在随后的查询中,第一个事务(T1)就会发现多了一些原本不存在的记录,就好像发生了幻觉一样,所以称为幻读。

四.事务的隔离级别
SQL 标准定义了四个隔离级别:
READ-UNCOMMITTED(读取未提交): 最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读。
READ-COMMITTED(读取已提交): 允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生。
REPEATABLE-READ(可重复读): 对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。
SERIALIZABLE(可串行化): 最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。
在这里插入图片描述

可以通过

 select @@global.tx_isolation;

来查看MySQL的事务默认隔离级别
在这里插入图片描述

发布了34 篇原创文章 · 获赞 15 · 访问量 3212

猜你喜欢

转载自blog.csdn.net/weixin_43404016/article/details/105448619