关于事务管理的理解和Spring事务管理详解
Posted 后端初学者
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于事务管理的理解和Spring事务管理详解相关的知识,希望对你有一定的参考价值。
每天一篇好文章系列18年第200期
什么是事务?事务的都有哪些特性?Spring事务管理是怎么实现的?
1
理解事务之前,先讲一个你日常生活中最常干的事:取钱。
比如你去ATM机取1000块钱,大体有两个步骤:首先输入密码金额,银行卡扣掉1000元钱;然后ATM出1000元钱。这两个步骤必须是要么都执行要么都不执行。如果银行卡扣除了1000块但是ATM出钱失败的话,你将会损失1000元;如果银行卡扣钱失败但是ATM却出了1000块,那么银行将损失1000元。所以,如果一个步骤成功另一个步骤失败对双方都不是好事,如果不管哪一个步骤失败了以后,整个取钱过程都能回滚,也就是完全取消所有操作的话,这对双方都是极好的。
事务就是用来解决类似问题的。事务是一系列的动作,它们综合在一起才是一个完整的工作单元,这些动作必须全部完成,如果有一个失败的话,那么事务就会回滚到最开始的状态,仿佛什么都没发生过一样。
在企业级应用程序开发中,事务管理必不可少的技术,用来确保数据的完整性和一致性。
事务的四个特性
原子性(Atomicity):
事务是一个原子操作,由一系列动作组成。事务的原子性确保了动作要么完全完成,要么完全不起作用。
一致性(Consistency):
一旦事务完成(不管成功还是失败),系统必须确保它所建模的业务处于一致的状态,而不会是部分完成部分失败。在现实中的数据不应该被破坏。
隔离性(lsolation):
可能有许多事务会同时处理相同的数据,因此每个事务都应该与其他事务隔离开来,防止数据损坏。
持久性(Durability):
一旦事务完成,无论发生什么系统错误,它的结果都不应该受到影响,这样就能从任何系统崩溃中恢复过来。通常情况下,事务的结果被写到持久化存储器中。
2
事务的隔离级别
事务的第二个维度就是隔离级别(isolation level)。隔离级别定义了一个事务可能受其他并发事务影响的程度。
-
并发事务引起的问题
在典型的的应用程序中,多个事务并发运行,经常会操作相同的数据来完成各种的任务。并发虽然是必须的,但可能会导致以下的问题:
脏读:(Dirty reads)——脏读发生在一个事务读取了另一个事务改写但尚未提交数据时。如果改写在稍后被回滚了,那么第一个事务获取的数据就是无效的。
不可重复读:(Nonrepeatable read)—— 不可重复读发生在一个事物执行相同的查询两次或两次以上,但是每次都得到不同的数据时。这通常是因为另一个并发事务在两次查询期间进行了更新。
幻读:(Phantom read)——幻读与不可重复读类似。它发生在一个事务(T1)读取了几行数据,接着另一个并发事务(T2)插入了一些数据时。在随后的查询中,第一个事务(T1)就会发现多了一些原本不存在的记录。
2. 隔离级别
ISOLATION_DEFAULT
使用后端数据库默认的隔离级别
ISOLATION_READ_UNCOMMITTED
最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读。
ISOLATION_READ_COMMITTED
允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读扔有可能发生。
ISOLATION_REPEATABLE_READ
对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。
ISONLATION_SERIALIZABLE
最高的隔离级别,完全服从ACID的隔离级别,确保阻止脏读,不可重复读以及幻读,也是最慢的事务隔离级别,因为它通常是通过完全锁定事务相关的数据库表来实现的。
3
总结
Spring提供了对编程式事务和声明式事务的支持,编程式事务允许用户在代码中精确定义事务的边界,而声明式事务(基于AOP)有助于用户将操作与事务规则进行解耦。
简单的说,编程式事务侵入到了业务代码里面,但是提供了更加详细的事务管理;而声明事务由于基于AOP,所以既能起到事务管理的作用,又可以不影响业务代码的具体实现。
点评:一个数据库的事务是一个被视为单一的工作单元的操作序列。这些操作应该要么完整的执行,要么完全不执行。
本文转自
CSDN
关于事务管理的理解和Spring事务管理详解
相关阅读推荐
深入了解请点击下方阅读原文
以上是关于关于事务管理的理解和Spring事务管理详解的主要内容,如果未能解决你的问题,请参考以下文章