详细说明春季使用编程的使用。
春季使转动交易操作变得非常容易。在春季控制交易的主要方法有两种
使用弹簧中提供的类来通过硬编码来控制交易。
这是最原始的方式,代码相对较大,其他方式则以这种方式封装。
直接看案件,有详细的注释,每个人都一目了然。
JDBCTEMPLATE将在代码中使用。对于那些不明白这一点的人
代码中有5个步骤
步骤1:定义事务管理器PlatformTransActionManager
交易管理器等效于管理员。该管理员用于帮助您控制事务,例如打开交易,提交交易,回滚交易等。
Spring使用PlatformTransactionManager代表交易管理器,
PlatformTransactionManager多个实现类用于应对不同的环境
![图片]()
JPATRACTIONMANAGER:如果您使用JPA操作DB,则需要使用此管理器来帮助您控制交易。
datasourcetransactionManager:如果使用指定数据源的方法,例如操作数据库:JDBCTEMPLATE,MYBATIS,IBATIS,则需要使用此管理器来帮助您控制交易。
Hibernatetransactions:如果您使用Hibernate操作DB,则需要使用此管理器来帮助您控制交易。
JTATRANSACTIONMANAR:如果您在Java中使用JTA操作DB,则通常是分布式交易。目前,您需要使用此管理器来控制交易。
在上面的案例代码中,我们使用JDBCTEMPLATE操作DB,因此使用此管理器。
步骤2:定义事务定义的交易属性
定义交易的属性,例如交易隔离级别,交易超时时间,交易通信,是否仅是交易等等。
Spring使用TransactionDefinition接口来表示交易的定义信息。有一个常用的类:DefaultTransactionDefinition。
事务属性有很多细节,长度相对较长。稍后将有详细的文章。
步骤3:开放交易
调用事务管理器的方法,也就是说,您可以打开事务
此方法将返回指示交易状态的对象。提供的一些方法可用于控制某些交易状态。例如,交易是最终需要退回还是需要提交。
执行后,Spring将在内部执行一些操作。为了促进每个人理解,让我们看一下伪代码:
上面的代码映射数据源数据源和连接到ThreadLocal。线程局部应熟悉同一线程的数据;我们可以通过Resource Sources ThreadLocal获得相应的连接对象。
步骤4:执行业务操作
我们使用JDBCTEMPLATE插入了2个记录。
让我们看一下创建JDBCTEMPLATE的代码。您需要指定数据源
让我们看一下创建交易管理器的代码
两者使用相同的数据源,当交易管理器打开事务时,它将在ThreadLocal中创建与数据源和连接映射的连接,并且当内部执行JDBCTEMPLATE时,需要获得连接。JDBCTEMPLATE会找到一个内部数据源内的thornlocal中的连接连接。如果直接使用,如果找不到它,它将被重新创建。目前,您可以找到它。
步骤5:提交或回滚
方法1中间的代码可以重复使用,因此Spring对其进行了优化。模板方法模式由模板方法模式封装,该模式主要保存提交或回滚的代码。
![图片]()
TransactionTemplate,有两种主要方法:
executeWithoutresult:无返回值场景
executeWithoutresult(消费者操作):如果没有返回值,则需要通过消费者对象进行接受方法进行业务操作
执行:有值班的回报率
t execute(TransActionCallback Action):如果您有返回值,则需要传递TransactionCallback对象。在DoIntransaction方法中,业务操作将自动提交交易或回滚交易。
交易何时回滚,有两种方式
方法1
执行内部执行内部执行或executeWithoutresult,该执行将标记为交易状态为回滚。春季将自动让交易向后回滚
方法2
可以将执行方法或ExecuteWithOult方法回滚。
交易何时提交?
没有异常的方法尚未称为TrassActionStatus.setRollllllllllly();
如果您真的想使用系统中的编程交易,则可以参考以下代码并使用Spring来管理对象,这更简洁。
首先,让我们有一个配置类,以注册事务管理器和交易模板以进行弹簧以进行重复使用。
通常,我们将业务运营投入服务,因此我们也来服务:Uservice。
数据将首先在BUS1中删除,然后将调用BUS2。目前,BUS1中的所有操作以及BUS2中的所有操作都将在一次交易中执行。操作,并调用内部BUS2,并且BUS2也称为内部。内部巴士将确定在线环境中是否有交易。因此,它直接参与了BUS1的业务。最后,Bus1和Bus2将以交易进行。
上面的BUS1代码将转换为SQL脚本如下:
让我们来看测试案例以查看效果
运行输出
在上面的代码中,如果BUS1或BUS2中存在异常或执行,则此时整个交易将回滚。你可以尝试一下!
大家看着之后,我会觉得这样很复杂。你为什么这样玩?
确实,它看起来更复杂。该代码被合并到大量的弹簧代码中。耦合相对较强,这不利于扩展。本文的目的不是让每个人将来使用它。如何控制它更容易学习。
我们使用大部分语句。声明性交易的底层仍然使用上述方法来控制交易,但已包装以使其更易于使用。
下一篇文章将详细说明声明性交易的使用。
原始:https://juejin.cn/post/709813503963588197