什么是事务:

事务是 一条或多条sql语句组成的一组执行单元。

事务的四大特性(ACID):

  1. 原子性:事务的执行要么都执行,要么都不执行。如果事务中一个 SQL 语句执行失败,则已执行的语句也必须回滚,数据库回退到事务开始前的状态。

  2. 一致性:执行事务前后,数据保持一致,多个事务对数据读取的结果是相同的。

  3. 隔离性:隔离性研究的是不同事务之间的相互影响。隔离性,是指事务内部的操作其他事务是隔离的,并发执行的各个事务之间不能互相干扰

  4. 持久性:一个事务提交后,对数据库中的修改时永久的。接下来的其他操作或故障不应该对其有任何影响。

    并发带来的问题有什么:

  5. 脏读:一个事务读取了其他事务还没有提交的数据,读到的是其他事务“更新”的数据

读取未提交数据

  1. 幻读:一个事务读取了其他事务还没有提交的数据,只是读到的是 其他事务“插入”的数据

幻读(前后多次读取,数据总量不一致)

  1. 不可重复读:一个事务多次读取,结果不一样。

(前后多次读取,数据内容不一致)

事务的隔离级别

解决并发带来的矛盾或者问题。

1.读未提交

Read Uncommitted,这种隔离级别中,什么问题都解决不了。

2.读已提交

Read Committed,在这种隔离级别中,数据的读取都是不加锁的,但是数据的写入、修改和删除是需要加锁的。可避免脏读情况发生。

3.可重复读

Repeatable Read,这是 MySQL 中 InnoDB 存储引擎默认的隔离级别。我们姑且分“读”和“写”两个模块来讲解

  • 读:其解决了脏读和不可重复读的问题,但却可能引发幻读的问题。
    • 很多人容易搞混不可重复读幻读,两者确实有些相似,但不可重复读的重点在于update和delete操作,而幻读的重点则在于insert操作。
    • 如果使用锁机制来实现这两种隔离级别,在可重复读中,该 SQL 第一次读取到数据后,就将这些数据加锁,其它事务无法修改这些数据,就可以实现可重复读了。但这种方法却无法锁住insert的数据,所以当事务A先前读取了数据,或者修改了全部数据,事务B还是可以insert数据提交,这时事务A就会发现莫名其妙多了一条之前没有的数据,这就是幻读,不能通过行锁来避免。
    • 需要Serializable隔离级别 ,读用读锁,写用写锁,读锁和写锁互斥,这么做可以有效的避免幻读、不可重复读、脏读等问题,但却会极大的降低数据库的并发能力。
    • 理解隔离级别

4.序列化

Serializable,这个级别很简单,读加共享锁,写加排他锁,读写互斥。使用悲观锁的理论,实现简单,数据更加安全,但是并发能力非常差。如果你的业务并发的特别少或者没有并发,同时又要求数据及时可靠的话,可以使用这种模式。