一、事务的特性(ACID)
四大特性都是为了保证一致性
原子性:要么全部完成,要么全部回滚,不能只执行一部分。
一致性:数据库事务总是从一个一致性的状态转换到另一个一致性的状态。
隔离性:一个事务所做的修改在commit之前,对其他的事务是不可见得。
持久性:事务被提交后就一直就会被永久的保留在数据库中。
二、隔离级别
未提交读
事务中的修改,即使没有提交对其他事务也都是可见的。可以读取未提交的数据也就是脏读
提交读(不可重复度)
一个事务开始到提交之前,所做的任何修改其他事务都是不可见的。
可重复读
解决了脏读的问题
可串行化
通过强制事务串行执行,避免幻读的问题。会在读取的每一行数据都加上锁。
一般隔离级别越高,越安全,但是并发程度越低。
脏读
事务A读取事务B未提交的事务,事务B修改数据后,并没有提交事务,这个时候事务A就能查到修改后的数据.这种事务并发问题就叫脏读。
不可重复读
事务A多次读取同一份数据,事务B在此过程中对数据修改并提交,导致事务A多次读取同一份数据的结果不一致。下图中事务B执行了update以后通过一个commit提交了修改,然后事务A读取到了其他事务提交的数据导致前后两次读取数据不一致情况,这种事务并发问题就叫不可重复读。update和delete都会造成不可重复读的现象。
幻读
事务A修改数据的同时,事务在A事务中执行了一个范围查询,这个时候满足条件的数据只有一条,这个时候事务B插入了一条数据,并且提交了.重点:插入了一行数据,在A事务里面再去查询的时候,发现多了一条数据.一个事务前后两次读取数据数据不一致,是由于其他事务插入数据造成的,这种情况就叫做幻读.
脏读是读取了未提交的数据,不可重复读和幻读都是读取了其他事务提交的数据。不可重复读主要是因为update和delete是数据被修改了。幻读是读了多出来的数据,强调前后插入数据的影响,是因为delete的影响。
死锁
下列图片会发生死锁