文章目录
事务
1.何为事务?
答:事务是逻辑上的一组操作,要么都执行,要么都不执行。
例子:
转账操作,假如小明要给小红转账1000元,这个转账会涉及两个关键操作就是:
1.将小明的余额减少1000元
2.将小红的余额增加1000元
事务会把这两个操作看成逻辑上的一个整体,这个整体包含的操作要么都成功,要么都失败
2.何为数据库事务?
答:平常我们谈论事务的时候,如果没有特指分布式事务,往往指的是数据库事务
2.1数据库事务有什么作用?
**答:**数据库事务保证多个对数据库的操作(SQL语句)构成一个逻辑上的整体。构成这个逻辑上的整体的这些操作遵循:要么全部执行成功,要么全部不执行
#开启事务 START TRANSACTION #多条SQL语句 SQL1,SQL2 ##提交事务 commit;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Pc5hWacA-1634455453799)(F:\有道云\weixinobU7VjiDXvYt2fu-NvyZjNp0QbSE\3b567405934c41a0b8b117beba7c3e99\207160554677.png)]
另外,关系型数据库(例如:MySQL、SQL Server、Oracle 等)事务都有 ACID 特性:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ilDp4UWN-1634455453801)(F:\有道云\weixinobU7VjiDXvYt2fu-NvyZjNp0QbSE\be90fce0b24a4fdfa618bf801403be5a\�性.png)]
3.何为 ACID 特性呢?
**1.原子性(Atomictiy):**事务是最小的执行单位,不允许分割,事务的原子性确保动作要么全部完成,要么完全不起作用;
**2.一致性(Consistency):**执行事务前后,数据保持一致,例如转账业务中,无论事务是否成功,转账者和收款人的总额应该是不变的;
**3.隔离性(Isolation):**并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的;
**4.持久性(Durability):**一个事物被提交之后,它对数据库中数据的改变是持久的,即使数据库发生故障也不应该对其有任何影响
4.数据事务的实现原理呢(ACID靠什么保证的)?
以InnoDB为例来说明一下
A:原子性由undo log(回滚日志)保证,它记录需要回滚的日志信息,事务回滚时撤销已执行的sql
C:一致性是由其他三大特性保证,程序代码要保证业务上的一致性
I:隔离性由MVVC来保证(默认支持的隔离级分别是REPEATABLE-READ)
D:MySQL InnoDB引擎使用redo log(重做日志)保证事务的持久性,mysql修改数据同时在内存和redo log记录这次操作,宕机的时候可以从redo log 恢复
InnoDB redo log 写盘,InnoDB 事务进入 prepare 状态。 如果前面 prepare 成功,binlog 写盘,再继续将事务日志持久化到 binlog,如果持久化成功,那么 InnoDB 事务则进入 commit 状态(在 redo log 里面写一个 commit 记录)
redolog的刷盘会在系统空闲时进行
5.并发事务带来哪些问题?
在典型的应用程序中,多个事务并发运行,经常会操作相同的数据来完成各自的任务(多个用户对同一数据进行操作)。并发虽然是必须的,但可能导致以下的问题
- **脏读:**当一个事务正在访问数据并且对数据进行了修改,而这种修改还没提交到数据库中,这时另外一个事务也访问了这个数据,然后使用了这个数据。因为这个数据是没有被提交的,那么事务读到的这个数据是“脏数据”
- **丢失修改:**一个事务修改一个数据的时,另外一个事务也读取到这个数据,当第一个事务对他进行修改后,第二个事务也进行了修改,这样第一个事务的修改结果就丢失了,因此被称为丢失修改
- 不可重复读: 指一个事务内多次读同一个事务,在这个事务还没有结束的时候,另外一个事务也访问该数据。那么第一事务的两次读取数据之间,由于第二个事务的修改导致一个事务内两次读到的数据是不太一样的情况,因此称为不可重复读。
- 幻读: 幻读与不可重复读类似。它发生在一个事务(T1)读取了几行数据,接着另一个并发事务(T2)插入了一些数据时。在随后的查询中,第一个事务(T1)就会发现多了一些原本不存在的记录,就好像发生了幻卷一样,所以称为幻读。
不可重复读和幻读的区别:
不可重复读的重点是修改比如多次读取一条记录发现其中某列的值被修改,幻读的重点在于新增或者删除比如多次读取一条记录发现记录增多或减少了。
6. 事务隔离级别
SQl 标准定义了四个隔离级别:
READ-UNCOMMITTED(读取未提交):最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读
**READ-COMMITTED:(读取已提交)**运行读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生
**REPEATABLE-READ(可重复读)**对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以防止脏读和不可重复读,但幻读有可能发生
SERIALIZABLE(可串行化)最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次执行,这样事务之间就完全不可能产生干扰,也就是说该级别可以防止脏读、不可重复读以及幻读
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
READ-UNCOMMITTED | √ | √ | √ |
READ-COMMITTED | × | √ | √ |
REPEATABLE-READ | × | × | √ |
SERIALIZABLE | × | × | × |
7. MySQL的默认隔离级别是什么?
MySQL InnDB存储引擎的默认支持的隔离级别的是 REPEATABLE-READ(可重读) 。