Spring4.x的事务

spring事务都是基于数据库事务进行的,“一荣俱荣,一损俱损”,ACID特性:

  1. Atomic 原子性,所有操作全部执行成功事务才提交,否则回滚
  2. Consistency 一致性,数据库所处的状态和业务规则是一致的,比如:A转账给B,不管成功与否,A+B的总额是不变的。
  3. Isolation 隔离性,不同事务拥有各自的隔离空间,隔离级别越高一致性越好,并发性越弱。
  4. Durability 持久性,事务一旦提交成功,所有数据必须持久化到数据库中,中途遇到崩溃等原因,也要有补偿机制。
    一致性 是最终目标,其他三个都是为达到一致性采取的措施和手段

数据并发问题:

场景解释
脏读A事务读到B事务尚未提交的更改数据,B事务回滚引发脏读
不可重复读A事务读取了B事务已经提交的更改数据导致两个时间点读取的余额不一样,加行级锁阻止操作中的数据发生变化
幻象读A事务读到了B事务新增的数据,加表级锁防止新增数据
第一类丢失更新A事务撤销时把已经提交的B事务的更新数据覆盖了
第二类丢失更新A事务提交时把已经提交的B事务的更新数据覆盖了

数据锁机制

锁(Oracle)介绍
行共享锁定SELECT FOR UPDATE隠式或LOCK TABLE IN ROW SHARE MODE显式。不能防止其他会话获取独占性数据表锁定,允许进行多个并发的行共享和行独占锁定,还允许进行数据表的共享或者采用共享行独占锁定
行独占锁定INSERT UPDATE DELETE隠式或LOCK TABLE ROW EXCLUSIVE MODE显式。可以防止其他会话获取一个共享锁定、共享行独占锁定或独占锁定。
表共享锁定LOCK TABLE IN SHARE MODE显式获得。
表共享行独占锁定LOCK TABLE IN SHARE ROW EXCLUSIVE MODE显式获得。防止其他会话获得表共享、行独占或者表独占锁定,但允许其他行共享锁定。
表独占锁定LOCK TABLE IN EXCLUSIVE MODE显式获得。防止其他会话对该表的任何锁定。

事务隔离级别

隔离级别脏读不可重复读幻象读第一类丢失更新第二类丢失更新
READ_UNCOMMITED允许允许允许不允许允许
READ_COMMITED不允许允许允许不允许允许
REPEATABLE不允许不允许允许不允许不允许
SERIALIZABLE不允许不允许不允许不允许不允许

JDBC3.0引入了保存点特性,可以回滚到特定的保存点

Spring 使用 ThreadLocal 解决线程安全问题

private static ThreadLocal<Connection> connThreadLocal = new ThreadLocal<Connection>();

事务管理的关键抽象

描述
PlatformTransactionManager根据TransactionDefinition提供的事务属性配置信息创建事务,并用TransationStatus描述这个激活事务的状态,提供getTransation commit rollback方法
TransactionDefinition定义了事务隔离,事务传播,事务超时,只读状态
TransationStatus获取事务运行期的状态信息,也可以间接的回滚事务,继承SavepointManager接口,createSavepoint rollbackSavepoint releaseSavepoint方法
事务说明
org.springframework.transaction.jta.JtaTransactionManager使用JPA进行持久化时,使用该事务管理器
org.springframework.orm.hibernate3.HibernateTransactionManager使用Hibernate X.0(X 可以为3 4 5)版本进行持久化时,使用该事务管理器
org.springframework.jdbc.datasource.DataSourceTransactionManager使用Spring JDBC 或 Mybatis 等基于DataSource数据源的持久化技术时,使用 该事务管理器
org.springframework.orm.jdo.JdoTransactionManager使用JDO进行持久化时 ,使用该事务管理器
org.springframework.transaction.jta.JtaTransactionManager具有多个数据源的全局事务使用该事务管理器(不管采用何种持久化技术)

####事务同步管理器TransationSynchronizationManager

持久化技术线程绑定资源获取工具
spring JDBC mybatisDataSourceUtils
HibernateSessionFactoryUtils
JPAEntityManagerFactoryUtils
JDOPersistenceManagerFactoryUtils
事务传播行为类型说明
PROPAGATION_REQUIRED如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。
PROPAGATION_SUPPORTS支持当前事务,如果当前没有事务,就以非事务方式执行。
PROPAGATION_MANDATORY使用当前的事务,如果当前没有事务,就抛出异常。
PROPAGATION_REQUIRES_NEW新建事务,如果当前存在事务,把当前事务挂起。
PROPAGATION_NOT_SUPPORTED以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER以非事务方式执行,如果当前存在事务,则抛出异常。
PROPAGATION_NESTED如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类 似的操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值