事务的详细介绍

事务的详细解析,包括ACID特性、隔离级别、传播特性及其在分布式系统中的挑战。介绍了分布式事务的三种常见解决方案:可靠消息最终一致性、最大努力通知和TCC强一致性。强调了TCC在资金等高一致性场景的应用,但其复杂性和维护成本较高。
摘要由CSDN通过智能技术生成

一、事务的概念:

1.数据库事务: 数据库事务通常指对数据库进行读或写的一个操作序列。

    它的存在包含有以下两个目的:

    1、为数据库操作提供了一个从失败中恢复到正常状态的方法,同时提供了数据库即使在异常状态下仍能保持一致性的方法。

    2、当多个应用程序在并发访问数据库时,可以在这些应用程序之间提供一个隔离方法,以防止彼此的操作互相干扰。



2.系统中的事务: 处理一系列业务处理的执行逻辑单元,该单元里的一系列类操作要不全部成功要不全部失败

二、为什么使用事务

可以保证数据的一致性和完整性(避免异常和错误等导致的数据信息异常) 

三、事务的特性ACID

原子性(Atomicity):事务包含的操作全部成功或者全部失败

一致性(Consistency):数据库从一个一致性状态变到另一个一致性状态

    (一系列操作后,所有的操作和更新全部提交成功,数据库只包含全部成功后的数据就是数据的一致性)

    (由于系统异常或数据库系统出现故障导致只有部分数据更新成功,但是这不是我们需要的最终数据,这就是数据的不一致)

隔离性(Isolation):事务互相隔离互不干扰

     (事务内部操作的数据对其它事务是隔离的,在一个事务执行完之前不会被其他事务影响和操作)

持久性(Durability):事务提交后数据应该被永久的保存下来,出现宕机等故障后可以恢复数据

四、数据库的隔离级别

此处使用http://blog.csdn.net/qq_33290787/article/details/51924963(写的很好,直接copy下来了)

数据库事务的隔离级别有4种,由低到高分别为Readuncommitted 、Read committed 、Repeatable read 、Serializable 。而且,在事务的并发操作中可能会出现脏读,不可重复读,幻读

Read uncommitted(读未提交,顾名思义,就是一个事务可以读取另一个未提交事务的数据。)

事例:老板要给程序员发工资,程序员的工资是3.6万/月。但是发工资时老板不小心按错了数字,按成3.9万/月,该钱已经打到程序员的户口,但是事务还没有提交,就在这时,程序员去查看自己这个月的工资,发现比往常多了3千元,以为涨工资了非常高兴。但是老板及时发现了不对,马上回滚差点就提交了的事务,将数字改成3.6万再提交。 

分析:实际程序员这个月的工资还是3.6万,但是程序员看到的是3.9万。他看到的是老板还没提交事务时的数据。这就是脏读。

那怎么解决脏读呢?Readcommitted!读提交,能解决脏读问题。

Readcommitted

读提交,顾名思义,就是一个事务要等另一个事务提交后才能读取数据。 

事例:程序员拿着信用卡去享受生活(卡里当然是只有3.6万),当他埋单时(程序员事务开启),收费系统事先检测到他的卡里有3.6万,就在这个时候!!程序员的妻子要把钱全部转出充当家用,并提交。当收费系统准备扣款时,再检测卡里的金额,发现已经没钱了(第二次检测金额当然要等待妻子转出金额事务提交完)。程序员就会很郁闷,明明卡里是有钱的… 

分析:这就是读提交,若有事务对数据进行更新(UPDATE)操作时,读操作事务要等待这个更新操作事务提交后才能读取数据,可以解决脏读问题。但在这个事例中,出现了一个事务范围内两个相同的查询却返回了不同数据,这就是不可重复读。 

那怎么解决可能的不可重复读问题?Repeatable read ! 

Repeatableread

Spring事务是Spring框架中的一个重要特性,它提供了一种在应用程序中管理事务的方式,能够确保数据的一致性和完整性。Spring事务的实现是基于AOP(面向切面编程)和Java Transaction API(JTA)的。 Spring事务主要涉及以下几个方面: 1. 事务管理器(Transaction Manager):事务管理器负责管理事务的生命周期,包括事务的开始、提交、回滚以及状态的检查等操作。Spring中提供了多种事务管理器的实现,如DataSourceTransactionManager、HibernateTransactionManager、JpaTransactionManager等。 2. 事务定义(Transaction Definition):事务定义定义了事务的隔离级别、传播行为、超时时间和只读属性等信息。Spring中提供了多种事务定义的实现,如DefaultTransactionDefinition、AnnotationTransactionDefinition等。 3. 事务切面(Transaction Aspect):事务切面是通过AOP实现的,它负责在方法执行前后,或者抛出异常时开启、提交、回滚或者关闭事务。 4. 事务注解(Transaction Annotation):Spring提供了@Transactional注解,可以在方法上或者类上使用,用于标识该方法或者类需要进行事务管理。 Spring事务的使用步骤如下: 1. 配置数据源和事务管理器。 2. 在需要事务管理的方法上添加@Transactional注解。 3. 根据具体业务需求,设置事务的隔离级别、传播行为和只读属性等。 Spring事务在应用程序中的优点如下: 1. 简化了事务管理的实现,使代码更加简洁和易于维护。 2. 提高了应用程序的性能和可伸缩性,避免了数据访问冲突和资源竞争。 3. 提供了对多种数据访问技术的支持,如JDBC、Hibernate、JPA等。 4. 提供了对分布式事务的支持,可以在多个数据源之间实现跨数据库的事务管理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值