关于事务方面的知识点,是我的面试生涯中的一个高频知识点,也是开发中比较常用的一个知识点。
所以,这回我要仔仔细细的详细总结一下,因个人水平有限,一家之言,如有不对的地方,欢迎各位的指正!
什么是事务,我的理解就是为了做一个目标任务,目标任务中的一系列的操作集合的单元,把这个事情单元叫做事务。
为了把这个事情做的漂亮,我们应该满足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.