1 定义
1.1 概念
一个最小的不可再分的工作单元;通常一个事务对应一个完整的业务。
1.2 特点
- 事务只和DML语句有关,或者说DML语句才有事务。这个和业务逻辑有关,业务逻辑不同,DML语句的个数不同。
- 一个完整的业务需要批量的DML(insert、update、delete)语句共同联合完成。
2 事务四大特性(ACID)
2.1 原子性(atommicty)
事务是最小的执行单位,不允许分割。事务的原子性保证动作要么全部完成,要么全部失败。
2.2 一致性(consistency)
执行事务后,数据保持一致,多个事务同一个数据读取的结果都是相同的。
2.3 隔离性(isolation)
并发访问数据库时,一个用户的事务不被其他事务所干扰,并发事务之间数据库是独立的。
2.4 持久性(durability)
一个事务被提交后,它对数据库的数据改变是持久的,数据库发生故障也不应该对其有任何影响。
3 并发事务问题
在应用程序中,多个事务并发运行,经常会操作相同的数据来完成各自的任务(多个用户对同一数据进行操作)。并发会带来以下问题:
- 脏读(Dirty read):当一个事务正在访问数据并且对数据进行修改,而这种修改还没有提交到数据库中,这时另一个事务也访问了这个数据,然后使用了这个数据。因为这个数据还没有提交的数据,那么另外一个事务读到这个数据是“脏数据”,依据“脏数据”所做操作可能不正确的。
- 丢失修改(Lost to modify):指在一个事务读取一个时,另一个事务也访问了数据库也访问了该数据,那么在第一个事务中修改数据中,第二个事务也修改了这个数据。这样第一个事务内修改的结果就被丢失,因此称为修改丢失。
- 不可重复读(Unrepeatableread): 指在一个事务内多次读同一数据。在这个事务还没有结束时,另一个事务也访问该数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改导致第一个事务两次读取的数据可能不太一样。这就发生了在一个事务内两次读到的数据是不一样的情况,因此称为不可重复读。
- 幻读(Phantom read): 幻读与不可重复读类似。它发生在一个事务(T1)读取了几行数据,接着另一个并发事务(T2)插入了一些数据时。在随后的查询中,第一个事务(T1)就会发现多了一些原本不存在的记录,就好像发生了幻觉一样,所以称为幻读。
不可重复读和幻读区别:
不可重复读的重点是修改比如多次读取一条记录发现其中某些列的值被修改,幻读的重点在于新增或者删除比如多次读取一条记录发现记录增多或减少了。
4 事务隔离级别
- READ-UNCOMMITTED(读取未提交): 最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读。
- READ-COMMITTED(读取已提交): 允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生。
- REPEATABLE-READ(可重复读): 对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。
- SERIALIZABLE(可串行化): 最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。
MySQL InnoDB 存储引擎的默认支持的隔离级别是 REPEATABLE-READ(可重读)。
引用:https://blog.csdn.net/w_linux/article/details/79666086
引用:https://github.com/Snailclimb/JavaGuide/blob/master/docs/database/MySQL.md