近日在做一个操作,需要牵涉到多个数据库的操作。当初在设计数据库的时候,数据库作为了前后台通信的数据记录凭证;且由于业务关系,多个凭证放到了不同数据库。当修改凭证的时候,会牵涉到多个数据库的修改。
整个过程运行了都基本无问题;但我在审阅代码的时候,发现一个很致命的问题:就是操作多个数据库的时候,没有保证多个数据库的数据的一致性;也就是一个数据库数据修改以后,如果发生错误,另一个数据库可能不会被修改,造成数据的不一致性。
正常情况下,不会发生数据不一致;但程序的意义,是保证更方便和流程无问题。于是,笔者想到了事务机制。
事务机制的基本特性是:ACID,即原子性,一致性,独立性和持久性。但笔者仔细研究以后,发现事务其实设计的初衷是在单个库中。
于是,就想到了跨库事务,以及相应的分布式事务
所谓跨库事务,就是写多个事务,如果一个发生错误,所有事务都回退。
所谓分布式事务,是有互联网公司提出分库分表之后的一系列解决方案。解决方案为多个:
1)强事务,即多个事务必须一致性,否则全部回退,典型如2PC和3PC(2PC家时间机制);
2)逐步事务,发生错误,回退到上一个阶段;
3)事后补偿机制,如消息队列机制。
由于设计事务比较简单,我最后采用了强事务机制。
伪代码如下:
try{
//第一个数据更改事务
Transaction1.update();
//第二个数据更改事务
Transaction2.update();
} catch(Exception e){
//第一个事务回退
Transaction1.rollback();
//第二个事务回退
Transaction2.rollback();
}
问题解决,欧耶。