数据库本地事务
1.什么是事务?
答:事务就是作为单个逻辑单元执行的一组操作,要么全成功,要么全失败。
2.事务的四大特性?
答:ACID。
原子性(Atomic):事务是由一个或多个活动所组成的一个工作单元。原子确保事务中的所有操作全部发生或全部不发生。如果所有的活动都成功了,事务也就成功了。如果任意一个活动失败了,整个事务也失败并回滚。
一致性(Consistent):一旦事务完成(不管成功还是失败),系统必须确保它所建模的业务处于一致的状态。现实的数据不应该被损坏。
隔离性(Isolated):事务允许多个用户对相同的数据进行操作,每个用户的操作不会与其他用户纠缠在一起。因此,事务应该被彼此隔离,避免发生同步读写相同数据的事情(注意的是,隔离性往往涉及到锁定数据库中的行或表)。
持久性(Durable):一旦事务完成,事务的结果应该持久化,这样就能从任何的系统崩溃中恢复过来。这一般会涉及将结果存储到数据库或其他形式的持久化存储中。
通俗的说事务,指一组操作,要么都成功执行,要么都不执行(原子性)
在所有的操作没有执行完毕之前,其它会话不能够看到中间改变的过程(隔离性)
事务发生前和发生后,数据的总额保持不变(一致性)
事务产生的影响不能被撤销(持久性)
3.事务中可能会出现的并发问题有哪些?
答:脏读、幻读、不可重复读是事务中的并发问题。
脏读:读到了某一个正在操作但还没有提交的数据,这样读到的数据很可能不是最终确定的数据,很可能那个人还回滚了。
不可重复读:两次连续的读取,数据不一致,可能是有人在你第一次读完之后将数据修改并提交了,导致你再读取的时候,数据和第一次读取的不一致,不知道该用哪一次。
幻读:往往是针对的整表的操作,比如经理让你将整张user表都删掉,结果在你删的期间,有人往这张表中加了一条记录,当你删完之后,你觉着数据库中没有这张表了,但是一查,这张表中还有一条数据,这个时候你觉着自己产生了幻觉,怎么还有一条呢?明明都已经删了。这就叫幻读。
4.事务中有几种隔离级别?
答:四种。读未提交、读已提交、可重复读、串行化。
读未提交:最低级别。不能防止任何并发问题。
读已提交:可避免脏读的发生,但不能防止不可重复读和幻读。
可重复读:可避免脏读和不可重复读的发生,但不能防止幻读。
串行化:完全隔离。可防止脏读、不可重复读和幻读问题的发生。
5.Spring事务中的传播行为指什么?有几种?
答:事务的传播行为指的是在业务方法之间平行调用时,如何来处理事务的问题。
Spring中定义事务传播行为的属性值有7种,分别是:required、requires_new、supports、not_supported、mandatory、nested、never。我们常用的是propagation=”REQUIRED”,默认的就是REQUIRED,指的是支持当前事务,如果不存在,就新建一个。