一:什么是事务
事务:简单来说就是一组操作要么全部成功,要么全部失败,没有中间状态,
最常见的例子就是转账:小黑给小黄转账100快,如果只是小黑的账户减少100块,小黄的账户余额不增加,你觉得合理吗?
所以事务就是要么都成功,要么都失败
二:事务的特性(ACID)
1.原子性(Atomicity): 事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么完全不起作用;
2.一致性(Consistency): 执行事务前后,数据保持一致,多个事务对同一数据的读取结果是相同的;
3.隔离性(Isolation): 并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的;
4.持久性(Durability): 一个事务被提交之后。它对数据库中数据的改变是持久的,即使数据库发生故障也不应该对其有任何影响。
三:脏读、丢失修改、不可重复读、幻读
1.脏读(Dirty read):读未提交,当一个事务A读取并修改一个数据,且没提交到数据库,但这个数据恰好被另一事务B读取,事务B读取的这个数据可能不是最终需要提交的数据,事务B拿着这个数据去做一些操作可能会出错;
2.丢失修改(Lost to modify):当一个事务A读取了一个数据后,事务B也读取了该数据,当事务A修改了这个数据之后,事务B也修改了该数据,事务A的修改被事务B的修改所覆盖,如事务A读取a=100,对其进行操作减去20,事务A提交之后a=80,当时事务B对a的操作是增加20,那么事务B提交之后a=120,事务A的修改被事务B所覆盖;
3.不可重复读(Unrepeatable Read):事务A在同一次事务中需要多次读取同一数据a,在事务A多次读取数据的间隙中事务B修改了数据a,导致事务A读取的数据不一致;
4.幻读(Phantom Read):幻读和不可重复读差不多,事务a读取了几行数据,事务B突然插入了几条数据,事务a重新读取时发现多了几条原本不存在的数据;
不可重复读的重点是修改:多次读取同一条记录发现其中某些列的值被修改;幻读的重点在于新增或者删除:多次读取发现记录增多或减少了。
三:事务的隔离级别
数据库定义了四种隔离级别,如下所示:
1:读未提交(READ-UNCOMMITTED):最低的隔离级别,允许读取尚未提交的数据变更, 可能会导致脏读、幻读或不可重复读。
2:读已提交(READ-COMMITTE):读取并发事务已经提交的数据, 可以阻止脏读,但是幻读或不可重复读仍有可能发生。
3:可重复读(REPEATABLE-READ):对同一字段的多次读取结果都是一致的,除非数据是被本身事务所修改, 可以阻止脏读和不可重复读,但幻读仍有可能发生。
4:串行化(SERIALIZABLE):最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰, 该级别可以防止脏读、不可重复读以及幻读。
MySQL InnoDb的默认级别是可重复读!