数据库基础知识整理

此文章为整理,参考文章太多不一一列举。

1.数据库的四大特性(ACID)

1)原子性:事务的所有操作,要不全部成功,要不全部失败(一个操作失败,回滚所有操作)。

2)一致性:符合业务规则,即事务完成前后,数据库中的数据都是符合业务规则的,比如:转账,总额加起来应该是不变的。

3)隔离性:事务之间不应该有影响,一个事务不应该影响到其他事务的执行。

4)持久性:事务一旦提交,对数据的修改就是永久的,不会回滚的。

2.数据库的事务隔离级别

1)读取未提交的内容:能够读取到其他事务未提交的数据,容易造成脏读。

2)读取已提交的内容:不能够读取到未提交的,只能读取到已提交的,能够造成幻读、不可重复读。

3)可重复读:事务A在执行的时候不允许其他事务修改A事务所涉及到的数据,即A事务在执行过程中,不管什么时候查询A事务所涉及到的数据,查询结果都不会变。能够造成幻读。

4)可串行化:事务挨个执行(或者两个事务操作的数据,不存在交集,可能会同时执行,这个我也不清楚^0^),或者锁表,不会造成脏读、幻读、不可重复读。不过效率比较低。

3.数据库读取出现的问题

1)脏读: 能够读取到事务未提交的数据,如果事务完成提交,则此数据没有问题,如果事务回滚,则此数据完全是没有用的错误数据。

2)不可重复读:事务A在事务中对同一数据执行了两次查询,结果两次结果不一样,说明这个数据被其他事务给修改了。这样就可能导致事务A执行失败回滚。

3)幻读:事务A在事务中对数据进行数量查询,结果第二次比第一次多,说明有其他事务在表中新增了数据。这样也会导致事务A出问题。

注:不可重复读和幻读都是因为其他事务提交的数据,对事务A产生了影响导致的。不可重复读侧重于其他事务update操作,幻读侧重于insert操作。可串行化则不会出现这两个问题。

4.数据库事务的其中传播方式

1)Require:支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择,也是 Spring 默认的事务的传播。

2)Supports:支持当前事务,如果当前没有事务,就以非事务方式执行。

3)Mandatory:支持当前事务,如果当前没有事务,就抛出异常。

4)RequiresNew:新建事务,如果当前存在事务,把当前事务挂起。新建的事务将和被挂起的事务没有任何关系,是两个独立的事务,外层事务失败回滚之后,不能回滚内层事务执行的结果,内层事务失败抛出异常,外层事务捕获,也可以不处理回滚操作

5)NotSupported:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。

6)Never:以非事务方式执行,如果当前存在事务,则抛出异常。

7)Nested:如果一个活动的事务存在,则运行在一个嵌套的事务中。如果没有活动事务,则按REQUIRED属性执行。它使用了一个单独的事务,这个事务拥有多个可以回滚的保存点。内部事务的回滚不会对外部事务造成影响。它只对DataSourceTransactionManager事务管理器起效。

传播方式的用处:有两个方法MethodA和MethodB,MethodA中调用了B,A中已经开启了事务,这是调用B,B是否单独开启事务,或者不开启事务,开启事务如果回滚是否都回滚还是单独B的事务回滚,就要依赖于传播方式的配置。

你可能感兴趣的:(数据库基础知识整理)