同步寫兩個資料庫
兩個資料庫假設在不同的伺服器,不同的例項.
db2的t表,增加一個tid為10的資料
一般應用程式,先寫一個庫提交,然後再寫一個庫.
假如第二個庫事務失敗,則事務補償第一個庫.
避免分散式事務是架構設計的重點.
可以採用如下的方式,減小不一致發生的機率.
先執行寫db1,但是並不提交.接著寫db2.
如果寫兩個庫,都沒有發生異常.則一起提交.否則一起回滾.
執行上述程式,在translogid為10的時候,db2有主鍵衝突的異常.db1會回滾已經寫入的資料.
這個模式有一個缺點.
db1的鎖持有時間和連線持有時間,增加了一倍.因為他要等待db2的處理結果.
- drop database db1;
- drop database db2;
- create database db1;
- use db1;
- create table t(translog int primary key,ts timestamp default current_timestamp);
- create database db2;
- use db2;
- create table t(translog int primary key,ts timestamp default current_timestamp);
- insert into t(translog) values(10);
db2的t表,增加一個tid為10的資料
一般應用程式,先寫一個庫提交,然後再寫一個庫.
假如第二個庫事務失敗,則事務補償第一個庫.
避免分散式事務是架構設計的重點.
可以採用如下的方式,減小不一致發生的機率.
- import java.sql.Connection;
- import java.sql.DriverManager;
- import java.sql.PreparedStatement;
- import java.sql.SQLException;
- public class Test {
- private synchronized static Connection getConnection(String dbName) {
- String URL = "jdbc:mysql://127.0.0.1:3306/" + dbName;
- String USERNAME = "xx";
- String PWD = "xx";
- Connection con = null;
- try {
- Class.forName("com.mysql.jdbc.Driver");
- con = DriverManager.getConnection(URL, USERNAME, PWD);
- con.setAutoCommit(false);
- } catch (SQLException e) {
- } catch (ClassNotFoundException e) {
- }
- return con;
- }
- public void insertDB(Connection con, int translogid) throws SQLException {
- PreparedStatement pt;
- pt = con.prepareStatement("insert into t(translog) values(?)");
- pt.setInt(1, translogid);
- pt.execute();
- }
- public void insertTranslogid(int translogid) {
- Connection db1 = getConnection("db1");
- Connection db2 = getConnection("db2");
- try {
- insertDB(db1, translogid);
- insertDB(db2, translogid);
- } catch (SQLException e) {
- e.printStackTrace();
- try {
- db1.rollback();
- db2.rollback();
- db1.close();
- db2.close();
- return;
- } catch (SQLException ex) {
- ex.printStackTrace();
- return;
- }
- }
- try {
- db1.commit();
- db2.commit();
- db1.close();
- db2.close();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
- public static void main(String[] args) throws ClassNotFoundException, SQLException {
- Test t = new Test();
- for (int i = 0; i <= 10; i++) {
- t.insertTranslogid(i);
- }
- }
- }
先執行寫db1,但是並不提交.接著寫db2.
如果寫兩個庫,都沒有發生異常.則一起提交.否則一起回滾.
執行上述程式,在translogid為10的時候,db2有主鍵衝突的異常.db1會回滾已經寫入的資料.
這個模式有一個缺點.
db1的鎖持有時間和連線持有時間,增加了一倍.因為他要等待db2的處理結果.
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29254281/viewspace-2119080/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 同步寫兩個資料庫--多執行緒資料庫執行緒
- 在兩個資料庫之間進行資料同步資料庫
- 透過作業定時同步兩個資料庫資料庫
- 資料庫學習:透過作業定時同步兩個資料庫(轉)資料庫
- rac 建立兩個資料庫資料庫
- 解決兩相同資料庫資料同步的問題 (轉)資料庫
- Mysql資料庫單向同步(一主兩從)MySql資料庫
- 使用scrapy框架把資料非同步寫入資料庫框架非同步資料庫
- 做資料庫分離讀寫時,sqlServer資料庫資料同步的問題:資料庫SQLServer
- OGG實現兩臺oracle資料庫的同步Oracle資料庫
- 完善昨天寫的資料庫結構同步方案資料庫
- 資料庫同步資料庫
- (7)資料庫讀寫分離,主從同步實現方法(資料庫設定)資料庫主從同步
- 使用Trigger實現兩個Table同步更新資料
- 比較兩個資料庫的差異資料庫
- 資料庫同步方案資料庫
- 管理叢集資料庫的兩個使用者與兩個命令資料庫
- 資料庫讀寫分離,主從同步實現方法資料庫主從同步
- 【LISTENER】一個資料庫配置兩個監聽埠號資料庫
- 使用 RMAN 同步資料庫資料庫
- 資料庫同步問題資料庫
- 用impdp同步資料庫資料庫
- 資料庫同步利器 otter 雙A同步配置資料庫
- DataX將MySql資料庫資料同步到Oracle資料庫MySql資料庫Oracle
- 手寫一個業務資料比對庫
- mysqdump 忽略某個資料庫的寫法資料庫
- 在一個資料庫中模擬兩個資料庫(每個資料庫中使用者都建立表的同義詞)資料庫
- 編寫觸發器實現兩張表資料同步,sql程式碼如下:觸發器SQL
- Git同步兩個遠端倉庫的分支程式碼Git
- 自動同步整個 MySQL/Oracle 資料庫以進行資料分析MySqlOracle資料庫
- 解決MySQL的主從資料庫沒有同步的兩種方法MySql資料庫
- DataX將Oracle資料庫資料同步到達夢資料庫Oracle資料庫
- 比對兩個資料庫的差異:Java篇資料庫Java
- SQL Server資料庫日誌清除的兩個方法SQLServer資料庫
- java比較mysql兩個資料庫中差異JavaMySql資料庫
- 從零寫一個時間序列資料庫資料庫
- 寫一個工具生成資料庫實體類資料庫
- [資料庫]MYSQL主從同步資料庫MySql主從同步