java面试总结(二)spring事务的基本原理

一、基本要素
1、 原子性(Atomicity):指一个事务要么全部执行,要么不执行,例如你从取款机取钱,这个事务可以分成两个步骤:1划卡,2出钱.不可能划了卡,而钱却没出来.这两步必须同时完成.要么就不完成。
2、一致性(Consistency):在事务执行前数据库的数据处于正常的状态,而事务执行完成后数据库的数据应该还处于正常的状态,即数据完整性约束没有被破坏。
3、隔离性(Isolation):并发事务执行之间应该互不影响,在一个事务内部的操作对其他事务是不产生影响的,这需要事务隔离级别来指定隔离性。
4、持久性(Durability):事务一旦执行成功,它对数据库的数据的改变必须是永久的,不会因比如遇到系统故障或断电造成数据丢失或改变。

二、分类
1、数据库分为本地事务和分布式事务
(1)本地事务:普通事务,独立一个数据库,能保证在该数据库上操作的ACID。
(2)分布式事务:涉及两个或多个数据库源的事务,即跨越多台同类或异类数据库的事务(由每台数据库的本地事务组成的),分布式事务旨在保证这些本地事务的所有操作的ACID,使事务可以跨越多台数据库。
2、Java事务类型分为JDBC事务和JTA事务
(1)JDBC事务:即为上面说的数据库事务中的本地事务,通过connection对象控制管理。
(2)JTA事务:JTA指Java事务API(Java Transaction API),是Java EE数据库事务规范, JTA只提供了事务管理接口,由应用程序服务器厂商(如WebSphere Application Server)提供实现,JTA事务比JDBC更强大,支持分布式事务。
3、事务实现方式分为声明式事务和编程式事务
(1)声明式事务:通过XML配置或者注解实现。
(2)编程式事务:通过编程代码在业务逻辑时需要时自行实现,粒度更小。

三、基本原理
1、Spring事务的本质其实就是数据库对事务的支持,没有数据库的事务支持,spring是无法提供事务功能的。
2、数据库层的事务提交和回滚是通过binlog或者redo log实现的。

四、数据库隔离级别

1、隔离级别比较以及部分数据库默认隔离级别

隔离级别 脏读 不可重复读 幻读 数据库默认级别
读未提交Read-Uncommitted
不可重复读(read-committed) SqlServer、Oracle
可重复读(repeatable-read) MySQL InnoDB
串行化(serializable)

2、名词释义:
(1)脏读:一事务对数据进行了增删改,但未提交,另一事务可以读取到未提交的数据。如果第一个事务这时候回滚了,那么第二个事务就读到了脏数据。

(2)不可重复读:一个事务中发生了两次读操作,第一次读操作和第二次操作之间,另外一个事务对数据进行了修改,这时候两次读取的数据是不一致的。

(3)幻读:第一个事务对一定范围的数据进行批量修改,第二个事务在这个范围增加一条数据,这时候第一个事务就会丢失对新增数据的修改。

(4)不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表。

五、spring事务的隔离级别

1、隔离级别的比较

常量 解释
ISOLATION_DEFAULT 这是个 PlatfromTransactionManager 默认的隔离级别,使用数据库默认的事务隔离级别。另外四个与 JDBC 的隔离级别相对应。
ISOLATION_READ_UNCOMMITTED 这是事务最低的隔离级别,它充许另外一个事务可以看到这个事务未提交的数据。这种隔离级别会产生脏读,不可重复读和幻像读。
ISOLATION_READ_COMMITTED 保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据,可以防止脏读。
ISOLATION_REPEATABLE_READ 这种事务隔离级别可以防止脏读,不可重复读。但是可能出现幻读。
ISOLATION_SERIALIZABLE 这是花费最高代价但是最可靠的事务隔离级别。事务被处理为顺序执行。

六、传播属性

常量名称 常量解释
PROPAGATION_REQUIRED 支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择,也是 Spring 默认的事务的传播。
PROPAGATION_REQUIRES_NEW 新建事务,如果当前存在事务,把当前事务挂起。新建的事务将和被挂起的事务没有任何关系,是两个独立的事务,外层事务失败回滚之后,不能回滚内层事务执行的结果,内层事务失败抛出异常,外层事务捕获,也可以不处理回滚操作。
PROPAGATION_SUPPORTS 支持当前事务,如果当前没有事务,就以非事务方式执行。
PROPAGATION_MANDATORY 支持当前事务,如果当前没有事务,就抛出异常。
PROPAGATION_NOT_SUPPORTED 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER 以非事务方式执行,如果当前存在事务,则抛出异常。
PROPAGATION_NESTED 如果一个活动的事务存在,则运行在一个嵌套的事务中。如果没有活动事务,则按REQUIRED属性执行。它使用了一个单独的事务,这个事务拥有多个可以回滚的保存点。内部事务的回滚不会对外部事务造成影响。它只对DataSourceTransactionManager事务管理器起效。
发布了11 篇原创文章 · 获赞 7 · 访问量 5039

猜你喜欢

转载自blog.csdn.net/rg201612/article/details/104678041
今日推荐