两个不同数据库 同一事务 怎么控制

两个不同数据库 同一事务 怎么控制,第1张

你两个数据库是一个连接吗

是两个连接的话,就未各个连接各开一个事务不就可以了吗

至于那个先那个后的

呵呵,在第二个执行完了

先commit第一个再commit第二个

出现在commit时出错的可能有多少一般数据错误在提交时的错误比较少吧

1普通事务

以 begin / start transaction 开始,commit / rollback 结束的事务。或者是带有保存点 savepoint 的事务。

2 链式事务

一个事务在提交的时候自动将上下文传给下一个事务,也就是说一个事务的提交和下一个事务的开始是原子性的,下一个事务可以看到上一个事务的处理结果。MySQL 的链式事务靠参数 completion_type 控制,并且回滚和提交的语句后面加上 work 关键词。

3 嵌套事务

有多个 begin / commit / rollback 这样的事务块的事务,并且有父子关系。子事务的提交完成后不会真的提交,而是等到父事务提交才真正的提交。

4 自治事务

内部事务的提交不随外部事务的影响,一般用作记录内部事务的异常情况。MySQL 不支持自治事务,但是某些场景可以用 MySQL 的插件式引擎来变相实现。

spring 那种是可以的,一般指定用 @Transaction 指定一个service方法的事务,在service方法里面,只有出现异常(这个异常是可以指定的。),导致这个方法没有正常结束,这个就会数据库回滚。你只有把 Update 和insert写在一个方法里,然后把这个方法加上事务控制,那就可以了。这里面的实现逻辑大概是这样,首先spring获取连接, 我们在service方法里进行数据库的 *** 作,然后方法结束, 如果正常结束,spring提交事务,释放连接。如果异常结束 ,spring 进行回滚,(这个回滚会把这个service方法内所有的修改 *** 作回滚。)释放连接。 大体的流程是这样。至于这些逻辑在数据库层面是如何实现的,我也不知道。

设想网上购物的一次交易,其付款过程至少包括以下几步数据库 *** 作:

一、更新客户所购商品的库存信息

二、保存客户付款信息--可能包括与银行系统的交互

三、生成订单并且保存到数据库中

四、更新用户相关信息,例如购物数量等等

正常的情况下,这些 *** 作将顺利进行,最终交易成功,与交易相关的所有数据库信息也成功地更新。但是,如果在这一系列过程中任何一个环节出了差错,例如在更新商品库存信息时发生异常、该顾客银行帐户存款不足等,都将导致交易失败。一旦交易失败,数据库中所有信息都必须保持交易前的状态不变,比如最后一步更新用户信息时失败而导致交易失败,那么必须保证这笔失败的交易不影响数据库的状态--库存信息没有被更新、用户也没有付款,订单也没有生成。否则,数据库的信息将会一片混乱而不可预测。

数据库事务正是用来保证这种情况下交易的平稳性和可预测性的技术。

Service层调用DAO层方法。

由于一个Service方法可能需要调用多个DAO对象的方法,需要在Service层进行事务控制。

由于一些原因,需要采用编程式事务(现使用TransactionTemplate)。

可是存在一个问题:

只有当创建TransactionTemplate对象的DataSourceTransactionManager使用的DataSource对象和DAO对象创建JdbcTemplate对象使用的DataSource是同一个对象时才能在transactionTemplateexecute()方法中控制事务。暂时想到如下设计:

1 BasicDao类

所有DAO的父类,提供静态变量DataSource用于为所有的DAO类创建JdbcTemplate对象。

同时提供DataSource的get方法,用于在Service方法中创建DataSourceTransactionManager对象。

public class BasicDao { private static DataSource dataSource; protected JdbcTemplate jdbc; static { dataSource = new MyDataSource(); } public BasicDao() { jdbc = new JdbcTemplate(dataSource); } //getters and setters } 2 DAO类

继承自BasicDao类,完成数据库 *** 作。

3 Service类

调用DAO类的方法,完成业务。

DataSource dataSource = BasicDaogetDataSource(); DataSourceTransactionManager txManager = new DataSourceTransactionManager(dataSource); TransactionTemplate txTemplate = new TransactionTemplate(txManager ); final Dao1 dao1= new Dao1(); final Dao2 dao2= new Dao2(); transactionTemplateexecute(new TransactionCallback(){ public Object doInTransaction(TransactionStatus arg0) { dao1function1(); dao2function2(); // return null; } }); 暂时只能这样来实现,请问各位有什么更好的实现吗?不要使用Spring的IOC容器和声明式事务。

以上面的Service方法为例吧:

1在ProxyClass中进行事务的控制,将DataSource保存到ThreadLocal。

2在ProxyClass中调用代理的具体Service类的service方法。

3Service类的service方法只完成具体的业务dao方法调用。

4Dao类的DataSource对象从ThreadLoacl中取得。

public class ProxyClass { public static final ThreadLocal threadLocal = new ThreadLocal(); private DataSourceTransactionManager txManager; private TransactionTemplate txTemplate; TargetService target; //代理的具体的目标服务对象 public ProxyClass() { DataSource dataSource = new MyDataSource(); txManager = new DataSourceTransactionManager(dataSource); txTemplate = new TransactionTemplate(txManager ); threadLocalset(dataSource); } public void service() { transactionTemplateexecute(new TransactionCallback(){ public Object doInTransaction(TransactionStatus arg0) { targetservice(); //调用具体服务方法 } }); } // } 问题补充:finallygo 写道不对的,你的代码编译可以通过吗

如果是直接使用JDBC进行 *** 作的话,在ThreadLocal应该存储Connection。

以上就是关于两个不同数据库 同一事务 怎么控制全部的内容,包括:两个不同数据库 同一事务 怎么控制、mysql数据库 事务提交怎么处理、java web项目中 大家是怎么做的事务控制呢等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9556240.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-29
下一篇 2023-04-29

发表评论

登录后才能评论

评论列表(0条)

保存