关于开发中事务的一些总结

        关于事务方面的知识点,是我的面试生涯中的一个高频知识点,也是开发中比较常用的一个知识点。

        所以,这回我要仔仔细细的详细总结一下,因个人水平有限,一家之言,如有不对的地方,欢迎各位的指正!

        什么是事务,我的理解就是为了做一个目标任务,目标任务中的一系列的操作集合的单元,把这个事情单元叫做事务。

      为了把这个事情做的漂亮,我们应该满足ACID的特征。ACID 我就简单粘贴复制一下,然后加入一些自己的一些看法,期待各位纠正,一起提高。

一、事务四个特性 ACID

原子性(Atomicity)
        原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。


一致性(Consistency)
        事务前后数据的完整性或数据的业务状态必须保持一致。

        最经典就是银行转账业务。假设这样一个场景:

 A同学和B同学各自银行卡上拥有一千元,A同学给B同学转了100元。

拆解一下就2步:

  • A同学数据库表中余额减少100元,1000-100=900;
  • B同学的数据库表余额要增加100元,1000+100=1100;

最终,A同学和B同学的总数还是2000元。这就是一致性。

隔离性(Isolation)
        事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他

事务的操作数据所干扰,多个并发事务之间要相互隔离。

多个事务同时处理同一个数据,每一个事务预期要隔离开来,防止数据被破坏。

(背后的一些知识点就是数据库的隔离级别相关问题。)
持久性(Durability)
        一个事务一旦被提交,完成后,它对数据库中数据的改变就是永久性的,接下来即使数据库

发生故障也不应该对其有任何影响。事务的结果被持久化到存储器中。

二、事务三大要素

1.DataSource  数据源,它是执行事务的真正的操作者,如:MySQL,Oracle等数据库。

2.TransactionManager: 管理事务的处理过程; 开启事务,提交事务,回滚事务。

3.事务应用和属性配置:作为一个标识符来表明哪些方法需要参与事务。常用的一些配置如:隔离级别和超时时间。

三,Spring事务设计中的核心接口

Spring 并不直接管理事务,而是提供了各种事务管理器,这些事务管理器将事务管理的工作委托给JPA或Hibernate 等持久化平台框架去实现。具体细节就是spring提供了PlatformTransactionManager接口,持久化平台框架对这个接口进行实现。

public interface PlatformTransactionManager {
    //由TransactionDefinition得到TransactionStatus对象
    TransactionStatus getTransaction(@Nullable TransactionDefinition definition) throws TransactionException;
    //提交事务
    void commit(TransactionStatus status) throws TransactionException;
    //回滚事务
    void rollback(TransactionStatus status) throws TransactionException;
}

1、jdbc事务

  如果应用程序中直接使用JDBC来进行持久化,DataSourceTransactionManager会为你处理事务边界。为了使用DataSourceTransactionManager,你需要使用如下的XML将其装配到应用程序的上下文定义中:

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
      <property name="dataSource" ref="dataSource" />
</bean>

实际上,DataSourceTransactionManager是通过调用java.sql.Connection来管理事务,而后者是通过DataSource获取到的。通过调用连接的commit()方法来提交事务,同样,事务失败则通过调用rollback()方法进行回滚。

2、Java持久化API事务(JPA)

  Hibernate多年来一直是事实上的Java持久化标准,但是现在Java持久化API作为真正的Java持久化标准进入大家的视野。如果你计划使用JPA的话,那你需要使用Spring的JpaTransactionManager来处理事务。你需要在Spring中这样配置JpaTransactionManager:

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
       <property name="sessionFactory" ref="sessionFactory" />
</bean>

sessionFactory属性需要装配一个JPA的session工厂,JpaTransactionManager的实现细节是:

        它将事务管理的任务委托给框架平台所构建的对象,而此对象是后者是中获取到的。当事务成功完成时,XxxTransactionManager将会调用Transaction对象的commit()方法,出席异常时,则将会调用rollback()方法。

这部分内容,牵涉到了 @Transactional 动态代理,还有Exception 等问题。要想好好的梳理好,其实还有很多文字要写。

乐观锁和悲观锁:

乐观锁: 用冗余的version字段 或者是updateTime . 1.先查 到v和time,然后更新时比较v和time.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值