什么是事务?
事务是逻辑上的一组操作,要么都执行,要么都不执行。
举个简单的例子
事务最经典的例子就是转账了。假如小明要给小刚转账100元,这个转账会涉及两个关键操作就是:
- 将小明的余额减少100元
- 将小刚的余额增加100元
事务会把这两个操作看成逻辑上的一个整体,这个整体包含的操作要么都成功,要么都失败。
这样就不会出现小明余额减少而小刚的余额并没有增加的情况。
什么是数据库事务?
我们在谈论事务的时候,如果没有特指分布式事务,往往指的就是数据库事务。
数据库事务的作用是什么?
简单来说,数据库事务可以保证多个对数据库的操作(也就是sql语句)构成一个逻辑上的整体。构成这个逻辑上的整体的这些数据库操作遵循:要么全部执行成功,要么全部执行不成功。
# 开启一个事务 START TRANSACTION; # 多条 SQL 语句 SQL1,SQL2... ## 提交事务 COMMIT;
另外,关系型数据库(MySQL,Oracle等)都具有ACID特性。
什么是ACID特性?
- 原子性(Atomicity):事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么完全不起作用。
- 一致性(Consistency):执行事务前后,数据保持一致,例如转账业务中,无论事务是否成功,转账者和收款人的总额应该是不变的。
- 隔离性(Isolation):并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的。
- 持久性(Durability):一个事务被提交之后,它对数据库中数据的改变是持久的,即使数据库发生故障也不应该对其有任何影响。
数据库的实现原理是什么?
MySQL InnoDB 引擎使用 redo log(重做日志)保证事务的持久性,使用 undo log(回滚日志)来保证事务的原子性。
MySQL InnoDB 引擎通过 锁机制、MVCC等手段来保证事务的隔离性(默认支持的隔离级别是REPEATABLE-READ)
保证了事务的持久性、原子性、隔离性之后,一致性才能得到保障。
并发事务带来哪些问题?
在典型的应用程序中,多个事务并发运行,经常会操作相同的数据来完成各自的任务(多个用户对同一数据进行操作)。并发可能导致以下的问题:
- 脏读(Dity read):当一个事务正在访问数据并且对数据进行了修改,而这种修改还没有提交到数据库中,这时另一个事务也访问了这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据,那么另一个事务读到的这个数据是“脏数据”,依据“脏数据”所做的操作时不正确的。
- 丢失修改(Lost to modify):指在一个事务读取一个数据时,另外一个事务也访问了该数据,那么在第一个事务中修改了这个数据后,第二个事务也修改了这个数据。



