当前位置: 首页 > news >正文

学计算机的做网站的叫什么工作河北通信网站建设

学计算机的做网站的叫什么工作,河北通信网站建设,商务网站建设公司排名,电商主图制作软件文章目录 【README】【1】事务基本元素【1.1】事务分类 【2】java事务管理【2.1】基于java的局部事务管理【2.2】基于java的分布式事务管理【2.2.1】基于JTA的分布式事务管理【2.2.2】基于JCA的分布式事务管理 【2.3】java事务管理的问题 【3】spring事务抽象概述【3.1】spring… 文章目录 【README】【1】事务基本元素【1.1】事务分类 【2】java事务管理【2.1】基于java的局部事务管理【2.2】基于java的分布式事务管理【2.2.1】基于JTA的分布式事务管理【2.2.2】基于JCA的分布式事务管理 【2.3】java事务管理的问题 【3】spring事务抽象概述【3.1】spring事务抽象的核心接口 【4】spring事务管理的3个接口【4.1】TransactionDefinition事务定义【4.1.1】隔离级别【4.1.2】事务传播行为【4.1.3】其他属性【4.1.4】TransactionDefinition实现类 【4.2】TransactionStatus事务状态【4.2.1】SavepointManager保存点抽象【4.2.2】TransactionStatus接口实现类 【4.3】PlatformTransactionManager平台事务管理器【4.3.1】PlatformTransactionManager实现类概览【4.3.2】PlatformTransactionManager内部结构【4.3.3】AbstractPlatformTransactionManager 【5】spring事务管理代码实践【5.1】spring集成mybatis及spring事务管理 【README】 本文总结自《spring揭秘》作者王福强非常棒的一本书墙裂推荐 【1】事务基本元素 1事务定义一组sql操作集合 是操作数据库的最小单元 2事务基本元素 ResourceManager资源管理器 简称RM 是对数据库的抽象TransactionProcessingMonitor事务处理监控 简称TPM 或 TP Monitor 在分布式事务场景中协调包含多个RM数据库的事务处理TransactionManager事务管理器 简称TM 是TP Monitor中的核心模块负责多RM数据库之间事务处理的协调工作并提供事务界定事务上下文传播等功能接口Application以独立形式存在的或者运行于容器中的应用程序可以认为是事务边界的触发点 3实际上并不是每个事务的场景中都会使用全部元素 【1.1】事务分类 1根据整个事务涉及的RM数据库数量来区分 局部事务 当前事务只涉及1个RM我们称当前事务为局部事务什么叫当前 个人理解当前指的是当前线程全局事务分布式事务 整个事务处理过程涉及多个RM 需要引入TP Monitor来协调多个RM之间的事务处理TP Monitor采用两阶段提交协议来保证整个事务的ACID属性 2全局事务中各参与者之间的关系 注意 局部事务与全局事务分布式事务的主要区别在于事务中涉及多少RM而不是系统中实际有多少RM 【2】java事务管理 1事务管理定义 划分事务边界规定事务起点与终点 【2.1】基于java的局部事务管理 1基于java的局部事务管理要对数据库的访问过程中进行事务管理每种数据访问技术都提供自身的事务管理api 如jdbcmybatis等 数据库资源的局部事务管理 基于jdbc的局部事务管理基于orm框架如hibernatemybaits的局部事务管理 消息服务资源的局部事务管理 如JMS 【2.2】基于java的分布式事务管理 1java分布式事务管理主要通过JTAjava事务api Java Transaction API 或者 JCAjava连接器架构 Java Connector Architecture 【2.2.1】基于JTA的分布式事务管理 1JTA由sun公司提出的标准化分布式事务访问的 java 接口规范。JTA规范定义的只是一套java接口定义具体实现由相应提供商实现 2JTA提供商产品包括 JOTMAtomikosJBoss Transaction 3使用JTA的分布式事务管理有2种方式 JTA编程事务管理JTA声明性事务管理 4JTA编程事务管理 通常使用 UserTransaction 接口进行各应用服务器都提供了针对他的JNDI查找服务 详情可以参见 https://blog.csdn.net/zzuhkp/article/details/124672647 【2.2.2】基于JCA的分布式事务管理 1JCA规范主要面向EISEnterprise Information System企业信息系统的集成 通过为遗留的EIS系统和java ee 应用服务器指定统一的通信标准 具体本文不展开 【2.3】java事务管理的问题 1问题1 事务管理逻辑绑定到了具体的数据访问技术上面耦合性高 使用JDBC数据访问技术通过java.sql.Connection管理事务使用Hibernate技术访问则通过Session管理事务这样使得事务管理代码与数据访问代码甚至业务代码耦合在一起事务管理本身属于系统功能不应该散落在各个业务代码逻辑上一个合理的设计应该是 事务管理代码 与数据访问代码或业务代码独立开 如果升级数据访问技术则与事务管理相关的代码都需要重构运维成本高 2问题2 事务异常处理没有一个统一的事务相关异常体系类似于原生SQL异常每个数据库厂商实现不一样如果数据库迁移或升级可能需要修改业务代码运维成本高 3问题3事务处理API的多样性 处理事务的API有很多如JDBCMybaitsHibernate等但没有统一事务管理api 【3】spring事务抽象概述 1spring对事务元素进行抽象 客户端仅按照统一的编程模型管理事务而不用关心数据访问技术以及具体要访问什么类型的事务资源 此外spring事务管理与spring提供的数据访问技术如JdbcTemplate进行结合 2spring事务框架设计的基本原则 让事务管理逻辑与数据访问逻辑解耦 具体也可以参见spring揭秘15-spring集成数据访问技术(orm框架)总结 【3.1】spring事务抽象的核心接口 1spring事务抽象的核心接口PlatformTransactionManager 平台事务管理器 主要作用是为应用程序提供事务管理的统一接口 【PlatformTransactionManager】 public interface PlatformTransactionManager extends TransactionManager {TransactionStatus getTransaction(Nullable TransactionDefinition definition) throws TransactionException;// 获取事务void commit(TransactionStatus status) throws TransactionException; // 提交事务 void rollback(TransactionStatus status) throws TransactionException; // 回滚事务 }2PlatformTransactionManager 子类 AbstractPlatformTransactionManager抽象平台事务管理器 DataSourceTransactionManager数据源事务管理器HibernateTransactionManagerHibernate事务管理器JdbcTransactionManagerJdbc事务管理器JpaTransactionManagerJPA事务管理器JtaTransactionManagerJTA事务管理器分布式事务管理器 CallbackPreferringPlatformTransactionManager回调偏好平台事务管理器ResourceTransactionManager资源事务管理器 【4】spring事务管理的3个接口 1spring事务抽象包括3个主要接口 PlatformTransactionManager TransactionDefinition TransactionStatus PlatformTransactionManager平台事务管理器 负责划定事务边界即事务起点与终点TransactionDefinition事务定义定义事务相关属性包括隔离级别 传播行为等 TransactionStatus事务状态 【4.1】TransactionDefinition事务定义 1TransactionDefinition定义了事务属性 事务隔离级别isolation事务传播行为propagation事务超时时间timeout是否为只读事务readOnly 【TransactionDefinition】 public interface TransactionDefinition {int PROPAGATION_REQUIRED 0;int PROPAGATION_SUPPORTS 1;int PROPAGATION_MANDATORY 2;int PROPAGATION_REQUIRES_NEW 3;int PROPAGATION_NOT_SUPPORTED 4;int PROPAGATION_NEVER 5;int PROPAGATION_NESTED 6;int ISOLATION_DEFAULT -1;int ISOLATION_READ_UNCOMMITTED 1;int ISOLATION_READ_COMMITTED 2;int ISOLATION_REPEATABLE_READ 4;int ISOLATION_SERIALIZABLE 8;int TIMEOUT_DEFAULT -1;default int getPropagationBehavior() {return 0;}default int getIsolationLevel() {return -1;}default int getTimeout() {return -1;}default boolean isReadOnly() {return false;}Nullabledefault String getName() {return null;}static TransactionDefinition withDefaults() {return StaticTransactionDefinition.INSTANCE;} } 【4.1.1】隔离级别 1TransactionDefinition 定义了如下5个常量用于表示隔离级别类型为int ISOLATION_DEFAULT 如果指定隔离级别为ISOLATION_DEFAULT则表示使用数据库默认隔离级别通常情况下是 ReadCommittedISOLATION_READ_UNCOMMITTED 读未提交ISOLATION_READ_COMMITTED读已提交ISOLATION_REPEATABLE_READ可重复读ISOLATION_SERIALIZABLE可串行化 【4.1.2】事务传播行为 1事务传播行为 表示整个事务处理过程所跨越的业务对象将以什么样的行为参与事务 class TeachService { // 授课服务teach() {publicTeacherService.teach(); // 公办老师授课trainingTeacherService.teach(); // 培训学校老师授课 } }// 公办授课服务 class PublicTeacherService{teach(); // (传播行为设置为 Required ) }// 培训学校授课服务 class TraningTeacherService {teach(); // (传播行为设置为 RequiredNew ) }【场景解说】 PublicTeacherService.teach()方法传播行为为 Required若TeachService.teach()本身开启事务1则 PublicTeacherService.teach()方法复用事务1若TeachService.teach()本身没有开启事务则 PublicTeacherService.teach()方法新开启事务1TraningTeacherService.teach()方法传播行为为 RequiredNew 若TeachService.teach()本身开启事务1则 TraningTeacherService.teach()方法新开启事务2若TeachService.teach()本身没有开启事务则 TraningTeacherService.teach()方法新开启事务2 2事务传播行为分类类型为int PROPAGATION_REQUIRED 如果当前存在事务则当前方法复用该事务否则当前方法创建新事务什么是当前 当前线程就是当前默认的事务传播行为PROPAGATION_SUPPORTS 如果当前开启事务则当前方法复用该事务否则当前方法直接执行不开启事务如事务自动提交PROPAGATION_MANDATORY强行要求当前方法存在一个事务否则抛出异常PROPAGATION_REQUIRES_NEW不管当前是否存在事务都会创建新事务如果当前存在事务则把当前事务挂起suspendPROPAGATION_NOT_SUPPORTED不支持当前事务而是在没有事务的情况下执行若当前存在事务则当前事务原则上被挂起suspend 但这要看对应的 PlatformTransactionManager实现类是否支持事务挂起PROPAGATION_NEVER永远不需要当前存在事务若当前存在事务则抛出异常PROPAGATION_NESTED如果存在当前事务则在当前事务的一个嵌套事务中执行底层原理是保存点Savepoint即在同一个事务新建多个保存点否则与 PROPAGATION_REQUIRED 类似即创建新事务在新事务 中执行注意并非所有PlatformTransactionManager都支持嵌套事务传播行为 PROPAGATION_NESTED PROPAGATION_NESTED中的嵌套事务依赖当前事务底层原理是保存点它们父子关系嵌套事务不能独立于当前事务而存在当前事务与嵌套事务共有事务状态嵌套事务应用场景可以把一个大事务划分为多个小事务来处理并且外层事务可以根据各个内部嵌套事务的执行结果选择不同执行流程PROPAGATION_REQUIRES_NEW新创建的事务与当前事务属于同一个级 它们是兄弟相互独立 【嵌套事务代码示例】 A.service() { // PROPAGATION_REQUIRED 必须事务try {B.service() // PROPAGATION_NESTED 嵌套事务} catch(Exception e) {C.service(); // PROPAGATION_NESTED 嵌套事务} }【4.1.3】其他属性 1事务超时时间 通过TIMEOUT_DEFAULT 常量来定义默认值为-1 单位秒 可以通过 TransactionDefinition 实现类提供自定义的事务超时时间 2只读事务通过 isReadOnly() 方法来定义 【4.1.4】TransactionDefinition实现类 1DefaultTransactionDefinition是 TransactionDefinition 的默认实现类其提供了各种事务属性的默认值 【DefaultTransactionDefinition】 默认事务定义实现类 public class DefaultTransactionDefinition implements TransactionDefinition, Serializable {public static final String PREFIX_PROPAGATION PROPAGATION_;public static final String PREFIX_ISOLATION ISOLATION_;public static final String PREFIX_TIMEOUT timeout_;public static final String READ_ONLY_MARKER readOnly;static final MapString, Integer propagationConstants Map.of(PROPAGATION_REQUIRED, 0, PROPAGATION_SUPPORTS, 1, PROPAGATION_MANDATORY, 2, PROPAGATION_REQUIRES_NEW, 3, PROPAGATION_NOT_SUPPORTED, 4, PROPAGATION_NEVER, 5, PROPAGATION_NESTED, 6);static final MapString, Integer isolationConstants Map.of(ISOLATION_DEFAULT, -1, ISOLATION_READ_UNCOMMITTED, 1, ISOLATION_READ_COMMITTED, 2, ISOLATION_REPEATABLE_READ, 4, ISOLATION_SERIALIZABLE, 8);private int propagationBehavior 0; // PROPAGATION_REQUIREDprivate int isolationLevel -1; // ISOLATION_DEFAULT private int timeout -1;private boolean readOnly false;Nullableprivate String name;public DefaultTransactionDefinition() {}public DefaultTransactionDefinition(TransactionDefinition other) {this.propagationBehavior other.getPropagationBehavior();this.isolationLevel other.getIsolationLevel();this.timeout other.getTimeout();this.readOnly other.isReadOnly();this.name other.getName();}public DefaultTransactionDefinition(int propagationBehavior) {this.propagationBehavior propagationBehavior;}// ...... }2TransactionDefinition实现类类图如下 3TransactionDefinition实现类按照编程式事务和声明式事务分为两类 编程式事务TransactionTemplate是进行编程式事务管理的模版方法类 TransactionTemplate继承了TransactionDefinition即TransactionTemplate本身提供了事务属性设置功能声明式事务TransactionAttribute应用于使用spring aop进行声明式事务管理的场景它在TransactionDefinition基础上添加了一个rollbackOn() 方法使用该方法业务代码通过声明的方式指定业务方法在抛出哪些异常情况下可以回滚事务 其直接实现类有DefaultTransactionAttribute 4DefaultTransactionAttribute下有2个子类包括 RuledBasedTransactionAttribute 和 DelegatingTransactionAttribute。 RuledBasedTransactionAttribute基于规则的事务属性类 其允许指定多个回滚规则 RuledBasedTransactionAttribute#rollbackOn()方法将使用传入的异常类型与这些回滚规则进行匹配然后在决定是否要回滚事务 回滚规则表示 RollbackRuleAttribute 或者 NoRollbackRuleAttribute RollbackRuleAttribute的子类 DelegatingTransactionAttribute委派事务属性类是抽象类 它存在的目的就是被子类化 DelegatingTransactionAttribute会将所有方法调用委派给另一个具体的TransactionAttribute实现类如DefaultTransactionAttributeRuledBasedTransactionAttribute 【TransactionAttribute】事务属性接口定义 public interface TransactionAttribute extends TransactionDefinition {NullableString getQualifier();CollectionString getLabels();boolean rollbackOn(Throwable ex); }【DefaultTransactionAttribute】默认事务属性接口实现类 public class DefaultTransactionAttribute extends DefaultTransactionDefinition implements TransactionAttribute {Nullableprivate String descriptor;Nullableprivate String timeoutString;Nullableprivate String qualifier;private CollectionString labels Collections.emptyList();public DefaultTransactionAttribute() {}public DefaultTransactionAttribute(TransactionAttribute other) {super(other);}public DefaultTransactionAttribute(int propagationBehavior) {super(propagationBehavior);}...... }【4.2】TransactionStatus事务状态 1TransactionStatus表示整个事务处理过程中的事务状态 通常情况下我们在编程式事务中使用该接口 【TransactionStatus】 public interface TransactionStatus extends TransactionExecution, SavepointManager, Flushable {default boolean hasSavepoint() {return false;}default void flush() {} }【TransactionExecution】 public interface TransactionExecution {default String getTransactionName() {return ;}default boolean hasTransaction() {return true;}default boolean isNewTransaction() {return true;}default boolean isNested() {return false;}default boolean isReadOnly() {return false;}default void setRollbackOnly() {throw new UnsupportedOperationException(setRollbackOnly not supported);}default boolean isRollbackOnly() {return false;}default boolean isCompleted() {return false;} }【SavepointManager】 public interface SavepointManager {Object createSavepoint() throws TransactionException;void rollbackToSavepoint(Object savepoint) throws TransactionException;void releaseSavepoint(Object savepoint) throws TransactionException; }【Flushable】 public interface Flushable {/*** Flushes this stream by writing any buffered output to the underlying* stream.** throws IOException If an I/O error occurs*/void flush() throws IOException; }【TransactionStatus类图】 2TransactionStatus工作方式 使用TransactionStatus查询事务状态通过 setRollbackOnly()方法标记当前事务以便回滚如果相应的PlatformTransactionManager支持Savepoint 可以通过TransactionStatus在当前事务中创建内部嵌套事务 【4.2.1】SavepointManager保存点抽象 1保存点的抽象 SavepointManager对Savepoint进行了抽象通过继承SavepointManagerTransactionStatus 获得可以管理Savapoint的能力从而支持创建事务内部嵌套事务 public interface SavepointManager {Object createSavepoint() throws TransactionException;void rollbackToSavepoint(Object savepoint) throws TransactionException;void releaseSavepoint(Object savepoint) throws TransactionException; } // TransactionStatus 继承 SavepointManager public interface TransactionStatus extends TransactionExecution, SavepointManager, Flushable {default boolean hasSavepoint() {return false;}default void flush() {} }【4.2.2】TransactionStatus接口实现类 1AbstractTransactionStatusTransactionStatus接口的抽象类 为子类提供一些基础设施 DefaultTransactionStatus默认事务状态类 是TransactionStatus主要实现类 spring事务框架中各个 TransactionManager的实现类大都使用 DefaultTransactionStatus 来记载事务状态信息SimpleTransactionStatus仅供测试不建议用于生产 【4.3】PlatformTransactionManager平台事务管理器 1PlatformTransactionManager 负责划定事务边界即事务起点与终点 public interface PlatformTransactionManager extends TransactionManager {TransactionStatus getTransaction(Nullable TransactionDefinition definition) throws TransactionException;// 获取事务void commit(TransactionStatus status) throws TransactionException; // 提交事务 void rollback(TransactionStatus status) throws TransactionException; // 回滚事务 }【4.3.1】PlatformTransactionManager实现类概览 1分为面向局部事务与全局事务分布式事务共计2个分支 2面向局部事务的PlatformTransactionManager实现类 AbstractPlatformTransactionManager抽象平台事务管理器 DataSourceTransactionManager数据源事务管理器HibernateTransactionManagerHibernate事务管理器JdbcTransactionManagerJdbc事务管理器JpaTransactionManagerJPA事务管理器 CallbackPreferringPlatformTransactionManager回调偏好平台事务管理器ResourceTransactionManager资源事务管理器 3面向全局事务分布式事务的PlatformTransactionManager实现类 JtaTransactionManagerJTA事务管理器分布式事务管理器JtaTransactionManager对各种JTA实现提供的分布式事务进行统一封装但底层会把事务管理操作委派给 具体的JTA实现类 【4.3.2】PlatformTransactionManager内部结构 1内部结构如下 TransactionObject事务对象承载了当前事务的必要信息PlatformTransactionManager实现类可以根据事务对象来决定如何处理当前事务 事务对象类似于 javax.transaction.Transaction 定义TransactionSynchronization可以注册到事务处理过程的回调接口类似于事务监听器如事务完成后或者回调方法清理系统资源TransactionSynchronizationManager 用于管理TransactionSynchronization 当前事务状态以及具体的事务资源类似于javax.transaction.TransactionSynchronizationRegistry定义 2spring事务抽象把PlatformTransactionManager作为核心接口及顶层接口具体实现由不同实现类处理整个事务管理框架的设计结合了策略模式与模版方法模式PlatformTransactionManager类图如下 【4.3.3】AbstractPlatformTransactionManager 1AbstractPlatformTransactionManager作为PlatformTransactionManager接口的抽象类以模版方法模式封装了事务处理逻辑而把与事务资源相关的操作交给子类实现 【AbstractPlatformTransactionManager】抽象平台事务管理器主要模版方法 public abstract class AbstractPlatformTransactionManager implements PlatformTransactionManager, ConfigurableTransactionManager, Serializable {// 获取事务public final TransactionStatus getTransaction(Nullable TransactionDefinition definition) throws TransactionException {// ......} // 挂起事务Nullableprotected final SuspendedResourcesHolder suspend(Nullable Object transaction) throws TransactionException {// ......}// 恢复事务protected final void resume(Nullable Object transaction, Nullable SuspendedResourcesHolder resourcesHolder) throws TransactionException {// ......} // 提交事务public final void commit(TransactionStatus status) throws TransactionException {// ......}// 回滚事务 public final void rollback(TransactionStatus status) throws TransactionException {// ......} } 2 AbstractPlatformTransactionManager定义的事务内部处理逻辑算法步骤如下 根据当前线程是否存在事务执行不同处理逻辑根据 TransactionDefinition指定的传播行为执行后续逻辑根据情况挂起或恢复事务提交事务前检查 readOnly若为true则用回滚事务替代提交事务在事务回滚的情况下清理并恢复事务状态若事务的Synchronization 处于active状态在事务处理的规定时点触发Synchronization 回调接口 3事务处理的完成有2种情况包括回滚事务与提交事务分别对应rollback() 与commit() 2个模版方法 commit()方法在提交事务前会检查rollBackOnly状态若为true则执行回滚补充可以通过TransactionStatus.setRollbackOnly()方法标记事务是否回滚 3.1rollback(TransactionStatus)包含3种情况 回滚事务 若当前事务是嵌套事务则通过TransactionStatus释放 Savepoint若当前事务是新事务则调用子类 doRollback(TransactionStatus)回滚事务若当前存在事务且 rollbackOnly被设置则调用 子类实现的 doSetRollbackOnly(TransactionStatus)方法各子类会将TransactionObject的状态设置为 rollbackOnly 触发Synchronization事件清理事务资源 设置 TransactionStatus.completed为完成状态清理与当前事务相关的 Synchronization调用 doCleanupAfterCompletion() 方法释放事务资源并解除 TransactionSynchronizationManager的资源绑定若有挂起的事务则恢复 3.2commit(TransactionStatus)处理逻辑如下 提交事务 提交事务前判断全局rollBackOnly标志是否为true如果最外层事务已经被标记为rollBackOnly并且failEarlyOnGlobalRollbackOnly为true则抛出异常若提交事务前发现TransactionStatus持有Savepoint则释放它这实际是在处理嵌套事务的提交若 TransactionStatus 表示要提交一个新事务则调用子类的commit()方法提交事务 触发Synchronization事件若 AbstractPlatformTransactionManager 的 rollbackOnCommitFailure状态被设置为true则表示若事务提交异常则回滚清理事务资源 【5】spring事务管理代码实践 1业务场景 新增银行卡包括2个步骤步骤1先插入银行卡 步骤2然后再通过id查询银行卡 步骤1插入逻辑在SpringAndMybatisTxMngServiceByRequired中 事务传播类型为 REQUIRED步骤2查询逻辑在 SpringAndMybatisTxMngServiceByRequiredAndNew 事务传播类型为 REQUIRES_NEW 两个service的事务传播类型不同以此来比较不同传播模式的事务管理效果 【5.1】spring集成mybatis及spring事务管理 【pom.xml】maven 依赖 project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersiongroupIdcom.tom.springnote/groupIdartifactIdspringDiscover/artifactIdversion1.0-SNAPSHOT/versionpackagingjar/packagingnamespringDiscover/nameurlhttp://maven.apache.org/urlpropertiesproject.build.sourceEncodingUTF-8/project.build.sourceEncoding/propertiesdependenciesdependencygroupIdorg.springframework/groupIdartifactIdspring-context/artifactIdversion6.1.10/version/dependencydependencygroupIdorg.springframework/groupIdartifactIdspring-beans/artifactIdversion6.1.10/version/dependencydependencygroupIdorg.springframework/groupIdartifactIdspring-aop/artifactIdversion6.1.10/version/dependencydependencygroupIdorg.springframework/groupIdartifactIdspring-web/artifactIdversion6.1.10/version/dependencydependencygroupIdorg.springframework/groupIdartifactIdspring-aspects/artifactIdversion6.1.10/version/dependencydependencygroupIdorg.springframework/groupIdartifactIdspring-jdbc/artifactIdversion6.1.10/version/dependencydependencygroupIdorg.springframework/groupIdartifactIdspring-orm/artifactIdversion6.1.10/version/dependencydependencygroupIdorg.springframework/groupIdartifactIdspring-tx/artifactIdversion6.1.10/version/dependency!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring --dependencygroupIdorg.mybatis/groupIdartifactIdmybatis-spring/artifactIdversion3.0.4/version/dependencydependencygroupIdorg.mybatis/groupIdartifactIdmybatis/artifactIdversion3.5.16/version/dependencydependencygroupIdorg.apache.commons/groupIdartifactIdcommons-dbcp2/artifactIdversion2.12.0/version/dependencydependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdversion8.0.32/version/dependencydependencygroupIdjavax.annotation/groupIdartifactIdjavax.annotation-api/artifactIdversion1.3.2/version/dependencydependencygroupIdcglib/groupIdartifactIdcglib/artifactIdversion3.3.0/version/dependency!-- https://mvnrepository.com/artifact/com.alibaba/druid --dependencygroupIdcom.alibaba/groupIdartifactIddruid/artifactIdversion1.2.22/version/dependencydependencygroupIdjunit/groupIdartifactIdjunit/artifactIdversion3.8.1/versionscopetest/scope/dependency/dependenciesbuildresourcesresourcedirectorysrc/main/java/directoryincludesinclude**/*.xml/include/includes/resourceresourcedirectorysrc/main/resources/directory/resource/resources/build/project【springAndMybatisIntegrate.xml】 ?xml version1.0 encodingUTF-8? beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexmlns:txhttp://www.springframework.org/schema/txxmlns:contexthttp://www.springframework.org/schema/contextxsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsdbean classorg.springframework.context.support.PropertySourcesPlaceholderConfigurerproperty namelocationsvaluejdbc-springdiscover.properties/value/property/bean!--注册数据源--bean iddataSource classcom.alibaba.druid.pool.DruidDataSource destroy-methodcloseproperty nameurl value${jdbc.url}/property namedriverClassName value${jdbc.driverClassName}/property nameusername value${jdbc.username}/property namepassword value${jdbc.password}//bean!--注册事务管理器--bean idtransactionManager classorg.springframework.jdbc.datasource.DataSourceTransactionManagerproperty namedataSource refdataSource//bean!-- 自动扫描注解 --context:component-scan base-packagecom.tom.springnote.chapter20mybaits/!-- 通过注解驱动的声明式事务管理 --tx:annotation-driven transaction-managertransactionManager/!-- 注册sql会话工厂 --bean idsqlSessionFactory classorg.mybatis.spring.SqlSessionFactoryBeanproperty namedataSource refdataSource/property nameconfigLocation valueclasspath:mybatisConf.xml/!-- 自动扫描mapping.xml文件**表示迭代查找,也可在sqlMapConfig.xml中单独指定xml文件--property namemapperLocations valueclasspath:com/tom/springnote/**/*.mapping.xml//bean!-- mybatis spring sqlSessionTemplate,使用时直接让spring注入即可 --bean idsqlSessionTemplate classorg.mybatis.spring.SqlSessionTemplateconstructor-arg index0 refsqlSessionFactory//bean/beans【jdbc-springdiscover.properties】 jdbc.urljdbc:mysql://localhost:3306/springdiscover?serverTimezoneAsia/Shanghai jdbc.driverClassNamecom.mysql.cj.jdbc.Driver jdbc.usernameroot jdbc.passwordroot【mybatisConf.xml】mybaits配置 设置mybatis会话操作日志如新建session提交事务回滚事务等日志 ?xml version1.0 encodingUTF-8? !DOCTYPE configuration PUBLIC-//mybatis.org//DTD Config 3.0//ENhttp://www.mybatis.org/dtd/mybatis-3-config.dtd configurationsettingssetting namelogImpl valueSTDOUT_LOGGING//settings /configuration【SpringTxMngServiceByRequiredAndNewMain】 public class SpringTxMngServiceByRequiredAndNewMain {public static void main(String[] args) {ClassPathXmlApplicationContext container new ClassPathXmlApplicationContext(chapter20/mybatis/springAndMybatisIntegrate.xml);SpringAndMybatisTxMngServiceByRequired txMngService container.getBean(SpringAndMybatisTxMngServiceByRequired.class);BankCardDto bankCardDto txMngService.saveAndQryByPropagation(BankCardDto.newBankCardDto(BusiDatetimeUtils.getCurYyyyMmDdHhMmSs()));if (bankCardDto null) {System.out.println(null);} else {System.out.println(bankCardDto);}} }【SpringAndMybatisTxMngServiceByRequired】 Component(springAndMybatisTxMngServiceByRequired) Transactional(propagation Propagation.REQUIRED, isolation Isolation.READ_COMMITTED, rollbackFor Exception.class) public class SpringAndMybatisTxMngServiceByRequired {Autowiredprivate BankCardDao bankCardDao;Autowiredprivate SpringAndMybatisTxMngServiceByRequiredAndNew springAndMybatisTxMngServiceByRequiredAndNew;public BankCardDto saveAndQryByPropagation(BankCardDto bankCardDto) {System.out.println( saveAndQryByPropagation begin);this.saveByPropagation(List.of(bankCardDto));BankCardDto result springAndMybatisTxMngServiceByRequiredAndNew.queryById(bankCardDto.getId());System.out.println( saveAndQryByPropagation end);return result;}public void saveByPropagation(ListBankCardDto bankCardDtoList) {System.out.println( saveByPropagation begin);bankCardDao.insertBankCard(bankCardDtoList.get(0));System.out.println( saveByPropagation end);} }【SpringAndMybatisTxMngServiceByRequiredAndNew】 Component(springAndMybatisTxMngServiceByRequiredAndNew) Transactional(propagation Propagation.REQUIRES_NEW, isolation Isolation.READ_COMMITTED, rollbackFor Exception.class) public class SpringAndMybatisTxMngServiceByRequiredAndNew {Autowiredprivate BankCardDao bankCardDao;public BankCardDto queryById(Long id) {System.out.println( queryById begin);BankCardDto result bankCardDao.qryBankCardById(id);System.out.println( queryById end);return result;}public BankCardDto saveAndQryByPropagation(BankCardDto bankCardDto) {System.out.println( saveAndQryByPropagation begin);this.saveByPropagation(List.of(bankCardDto));BankCardDto result this.queryById(bankCardDto.getId());System.out.println( saveAndQryByPropagation end);return result;}public void saveByPropagation(ListBankCardDto bankCardDtoList) {System.out.println( saveByPropagation begin);if (CollectionUtils.isEmpty(bankCardDtoList)) {return;}bankCardDao.insertBankCard(bankCardDtoList.get(0));System.out.println( saveByPropagation end);} }【BankCardDao】 Repository public class BankCardDao {Autowiredprivate SqlSessionTemplate sqlSessionTemplate;private static final String NAMESPACE com.tom.springnote.chapter20mybaits.dao.bankcard;public void insertBankCard(BankCardDto bankCardDto) {sqlSessionTemplate.insert(NAMESPACE .insertBankCard, bankCardDto);}public BankCardDto qryBankCardById(Long id) {ListBankCardDto resultList sqlSessionTemplate.selectList(NAMESPACE .qryBankCardById, id);if (CollectionUtils.isEmpty(resultList)) {return null;} else {return resultList.get(0);}} }【BankCard.mapping.xml】 ?xml version1.0 encodingUTF-8 ? !DOCTYPE mapper PUBLIC -//mybatis.org//DTD Mapper 3.0//EN http://mybatis.org/dtd/mybatis-3-mapper.dtd mapper namespacecom.tom.springnote.chapter20mybaits.dao.bankcardselect idqryBankCardById resultTypecom.tom.springnote.common.model.BankCardDtoselect id, card_no, balance, remarkfrom bank_card_tbl where id #{id}/selectinsert idinsertBankCardinsert into bank_card_tbl (id, card_no, balance, remark)values (#{id}, #{cardNo}, #{balance}, #{remark})/insert /mapper【打印日志】 信息: {dataSource-1} initedsaveAndQryByPropagation begin saveByPropagation beginCreating a new SqlSessionRegistering transaction synchronization for SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession724bade8]JDBC Connection [com.alibaba.druid.pool.DruidStatementConnection6815c5f2] will be managed by Spring Preparing: insert into bank_card_tbl (id, card_no, balance, remark) values (?, ?, ?, ?) Parameters: 20240908163727(Long), 20240908163727(String), 20240908163727(BigDecimal), 备注20240908163727(String) Updates: 1Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession724bade8] saveByPropagation endTransaction synchronization suspending SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession724bade8] queryById beginCreating a new SqlSessionRegistering transaction synchronization for SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession6ab72419]JDBC Connection [com.alibaba.druid.pool.DruidStatementConnection5bbc9f97] will be managed by Spring Preparing: select id, card_no, balance, remark from bank_card_tbl where id ? Parameters: 20240908163727(Long) Total: 0Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession6ab72419] queryById endTransaction synchronization committing SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession6ab72419]Transaction synchronization deregistering SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession6ab72419]Transaction synchronization closing SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession6ab72419]Transaction synchronization resuming SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession724bade8] saveAndQryByPropagation end Transaction synchronization committing SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession724bade8] Transaction synchronization deregistering SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession724bade8] Transaction synchronization closing SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession724bade8]null [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS 【日志解说】 1事务传播机制 SpringAndMybatisTxMngServiceByRequired 事务传播机制是 Propagation.REQUIRED 当前线程存在事务则复用否则新建事务SpringAndMybatisTxMngServiceByRequiredAndNew 事务传播机制是 Propagation.REQUIRES_NEW 无论当前线程是否存在事务则当前方法新建事务若当前线程存在事务1则先挂起事务1然后新建事务2事务2执行完成后恢复事务1 2新建会话及事务一个会话就是一个数据库连接1个会话对应多个事务 SpringAndMybatisTxMngServiceByRequired#saveAndQryByPropagation() 方法先调用 this.saveByPropagation() 再调用 SpringAndMybatisTxMngServiceByRequiredAndNew.queryById() 方法其中saveByPropagation的事务传播模式是REQUIRED queryById的事务传播模式是REQUIRES_NEW this.saveByPropagation() 方法执行时 创建 SqlSession[DefaultSqlSession724bade8] 开启事务执行insert操作SpringAndMybatisTxMngServiceByRequiredAndNew.queryById() 执行前实际先执行spring 事务切面因为queryById是REQUIRES_NEW 需要新建事务所以会先挂起suspending当前会话事务 SqlSession[DefaultSqlSession724bade8] 接着再新建会话[DefaultSqlSession6ab72419] queryById()执行完成后再提交事务DefaultSqlSession6ab72419关闭会话最后一步是恢复(resuming)会话 [DefaultSqlSession724bade8] SpringAndMybatisTxMngServiceByRequired.saveAndQryByPropagation() 执行完成后 提交事务关闭会话 [DefaultSqlSession724bade8] 3查询结果为null SpringAndMybatisTxMngServiceByRequired#saveAndQryByPropagation是事务1保存时没有提交事务SpringAndMybatisTxMngServiceByRequiredAndNew#queryById是事务2因为事务1没有提交所以事务2查询不到数据所以是null事务隔离级别读已提交
http://www.dnsts.com.cn/news/194357.html

相关文章:

  • 云梦做网站的优势手机微信网站开发
  • 织梦如何做淘宝客网站黑帽seo培训大神
  • 外贸网站建站那家公司好无货源电商软件app
  • 网站建设网络安全竞价推广和信息流推广
  • 建站之星模板制作吉林省住房和城乡建设厅网站
  • 国内做的比较好的协会网站做网站用c语言可以吗
  • 长春做网站企业网页制作教程dw
  • 黄州区精神文明建设网站软文营销常用的方式
  • 石家庄住房和城乡建设局网站帝国网站后台管理系统
  • 晋安网站建设兰山网站建设公司
  • 阿里云 建网站攻略建设c2c网站需要多少投资
  • 做带v头像的网站网站做营利性广告需要什么备案
  • 上海备案证查询网站查询网站查询女人与黑狗做视频网站
  • 建设银行官方网站网页版建设部评职称网站
  • 电影点播网站开发费用软件开发八个阶段
  • 冠县做网站推广网站开发第三方支付
  • 怎么给自己的公司建立网站免费的写作网站
  • 怎么做各个地图网站的认证如何给wordpress文章排版
  • 柳州公司网站建设免费做字体的网站
  • 网站建设的制度黄页网址大全免费
  • 企业全屏网站白帽网站
  • 广州网站优化工具做包装看什么网站
  • 江苏靖江苏源建设有限公司招标网站网站推广书
  • 民族文化网站建设的作用网站建设公司不能备案吗
  • 工程建设国家标准网站天津宇昊建设集团有限公司网站
  • jsp做网站都可以做什么网站响应式好吗
  • 河南企业站seo漫画做视频在线观看网站
  • 如何提升网站alexa排名网站常见结构有那些
  • 网站广告制作惠州广告公司排名
  • 番禺做网站企业免费网页制作软件手机版