SharePlex qview工具 vs OGG logdump工具探究兩個複製工具事務開始 or 事務提交複製?
Goal
探究SharePlex與Oracle Goldengate事務開始複製還是事務提交之後複製。
1.SharePlex驗證
1.1 搭建一個簡單SharePlex鏈路
本地oracle到kafka鏈路,配置如下:
sp_ctrl (single:12000)> view config kafka datasource:o.messay #source tables target tables routing map expand hr.% not (TEST_TYPE) !kafka single sp_ctrl (single:12000)> show Process Source Target State PID ---------- ------------------------------------ ---------------------- -------------------- ------ Capture o.messay Running 8336 Read o.messay Running 8338 Post o.messay-single x.kafka Running 8836 sp_ctrl (single:12000)> qstatus Queues Statistics for single Name: o.messay (Capture queue) Number of messages: 0 (Age 0 min; Size 2 mb) Backlog (messages): 0 (Age 0 min) Name: single (o.messay-x.kafka) (Post queue) Number of messages: 0 (Age 0 min; Size 1 mb) Backlog (messages): 0 (Age 0 min)
1.2 測試
1.2.1 源端插入資料,並不提交
06:20:55 HR@messay > insert into test values(19,'s(*)*dfsfdsdfsdfs'); 1 row created.
1.2.2 檢視佇列資料
sp_ctrl (single:12000)> qstatus Queues Statistics for single Name: o.messay (Capture queue) Number of messages: 0 (Age 0 min; Size 2 mb) Backlog (messages): 0 (Age 0 min) Name: single (o.messay-x.kafka) (Post queue) Number of messages: 0 (Age 0 min; Size 1 mb) Backlog (messages): 0 (Age 0 min)
1.2.3 qview檢視佇列資料
[oracle@single rim]$ qview -i qview> qinit # 初始化qview工具 qview> list # 列出當前所有佇列 The following queues exist: o.messay+C WRITER +PA+o.messay+sp_ocap+o.messay READER +PR+o.messay+sp_ordr+o.messay single+P+o.messay-x.kafka subqueues range from 0 to 7 WRITER +PR+o.messay+sp_ordr+o.messay READER +PP+single+sp_xpst+o.messay-x.kafka qview> sque o.messay+C # 檢視capture佇列所有的sub queue子佇列 Queue name: o.messay+C qview> sque single+P+o.messay-x.kafka # 檢視子佇列訊息數量 Queue name: single+P+o.messay-x.kafka qview>
# 可以看到佇列中沒有任何資料,那是否SharePlex沒有複製呢?我們繼續驗證
1.2.4 繼續插入資料,依然不提交
06:23:54 HR@messay > insert into test values(20,'6646dfsfdsdfsdfs'); 1 row created.
1.2.5 檢視佇列,可以看到post佇列中已經有一條message
sp_ctrl (single:12000)> qstatus Queues Statistics for single Name: o.messay (Capture queue) Number of messages: 0 (Age 0 min; Size 2 mb) Backlog (messages): 0 (Age 0 min) Name: single (o.messay-x.kafka) (Post queue) Number of messages: 1 (Age 0 min; Size 1 mb) Backlog (messages): 0 (Age 0 min)
1.2.6 qview驗證訊息
sp_ctrl (single:12000)> stop post [oracle@single rim]$ ../../prodir/bin/qview -i qview> qinit qview> list The following queues exist: o.messay+C WRITER +PA+o.messay+sp_ocap+o.messay READER +PR+o.messay+sp_ordr+o.messay single+P+o.messay-x.kafka subqueues range from 0 to 7 WRITER +PR+o.messay+sp_ordr+o.messay READER +PP+single+sp_xpst+o.messay-x.kafka qview> set out qview> set detail full qview> sque single+P+o.messay-x.kafka Queue name: single+P+o.messay-x.kafka Subqueue 6: 1 msgs 2:10 mins qview> open p r Current queue single+P+o.messay-x.kafka user +PP+single+sp_xpst+o.messay-x.kafka qview> oread 6 1 Total messages read: 1 qview> exit [oracle@single rim]$ cat qview.out OREAD 6 1 : Sun Aug 23 06:29:07 2020 for single+P+o.messay-x.kafka --------------------------------------------------- Sque 6, seq 0, mid 17, sqmid 1, mflags 0 odr_magic 0x4f445236 odr_op ODR_INSERT1 (1) odr_trans 7(5).3169-6(1145) odr_time 08/23/20 06:23:55 (1049178235) odr_sid messay odr_seq#/offset 26/33896976 odr_scn (high) 0 odr_scn 16534229 odr_userid 84 odr_flags 0x2040000 odr_cdr_flags 0 odr_marker 0 odr_actid 8 odr_obj 89612 odr_oname "HR"."TEST" odr_userid 84 odr_nrow 1 odr_datasize 0 odr_forward 1 odr_forback 0 odr_opnum 0 odr_rid [0] AAAV9qAAEAAAAnDAAB at 0x0x7fffb4744f48 data image columns = 0 data = 0x7fffb4744f5c key image columns = 2 data = 0x7fffb4744f5c [1] length=2 19 [2] length=17 s(*)*dfsfdsdfsdfs
# 根據rowid查詢該條資料,發現post佇列中資料為我們剛插入的第一條資料,並沒有第二條資料
06:26:38 HR@messay > select * from test where rowid='AAAV9qAAEAAAAnDAAB'; ID NAME ---------------------------------------- ---------------------------------------- 19 s(*)*dfsfdsdfsdfs
# SharePlex應該是將最後一條資料作為判斷是否提交的依據,如果最後一天訊息不是commit訊息,則不放入佇列,只讀取並且將倒數第二條訊息寫入佇列。
# 接下來我們繼續驗證
1.2.7 繼續插入繼續檢視
06:35:02 HR@messay > insert into test values(21,'6646'); 1 row created. sp_ctrl (single:12000)> show Process Source Target State PID ---------- ------------------------------------ ---------------------- -------------------- ------ Capture o.messay Running 8336 Read o.messay Running 8338 Post o.messay-single x.kafka Running 9572 sp_ctrl (single:12000)> qstatus Queues Statistics for single Name: o.messay (Capture queue) Number of messages: 0 (Age 0 min; Size 2 mb) Backlog (messages): 0 (Age 0 min) Name: single (o.messay-x.kafka) (Post queue) Number of messages: 2 (Age 8 min; Size 1 mb) Backlog (messages): 0 (Age 0 min) sp_ctrl (single:12000)> stop post [oracle@single rim]$ qview -i qview> qinit qview> set out qview> set detail full qview> list The following queues exist: o.messay+C WRITER +PA+o.messay+sp_ocap+o.messay READER +PR+o.messay+sp_ordr+o.messay single+P+o.messay-x.kafka subqueues range from 0 to 7 WRITER +PR+o.messay+sp_ordr+o.messay READER +PP+single+sp_xpst+o.messay-x.kafka qview> open p r Current queue single+P+o.messay-x.kafka user +PP+single+sp_xpst+o.messay-x.kafka qview> sque single+P+o.messay-x.kafka Queue name: single+P+o.messay-x.kafka Subqueue 6: 2 msgs 11:14 mins qview> oread 6 2 Total messages read: 2 qview> exit [oracle@single rim]$ cat qview.out OREAD 6 2 : Sun Aug 23 06:38:01 2020 for single+P+o.messay-x.kafka --------------------------------------------------- Sque 6, seq 0, mid 17, sqmid 1, mflags 0 odr_magic 0x4f445236 odr_op ODR_INSERT1 (1) odr_trans 7(5).3169-6(1145) odr_time 08/23/20 06:23:55 (1049178235) odr_sid messay odr_seq#/offset 26/33896976 odr_scn (high) 0 odr_scn 16534229 odr_userid 84 odr_flags 0x2040000 odr_cdr_flags 0 odr_marker 0 odr_actid 8 odr_obj 89612 odr_oname "HR"."TEST" odr_userid 84 odr_nrow 1 odr_datasize 0 odr_forward 1 odr_forback 0 odr_opnum 0 odr_rid [0] AAAV9qAAEAAAAnDAAB at 0x0x7fffe5d2d268 data image columns = 0 data = 0x7fffe5d2d27c key image columns = 2 data = 0x7fffe5d2d27c [1] length=2 19 [2] length=17 s(*)*dfsfdsdfsdfs Sque 6, seq 393, mid 18, sqmid 2, mflags 0 odr_magic 0x4f445236 odr_op ODR_INSERT1 (1) odr_trans 7(5).3169-6(1145) odr_time 08/23/20 06:26:39 (1049178399) odr_sid messay odr_seq#/offset 26/34054160 odr_scn (high) 0 odr_scn 16534678 odr_userid 84 odr_flags 0x2040000 odr_cdr_flags 0 odr_marker 0 odr_actid 8 odr_obj 89612 odr_oname "HR"."TEST" odr_userid 84 odr_nrow 1 odr_datasize 0 odr_forward 1 odr_forback 0 odr_opnum 0 odr_rid [0] AAAV9qAAEAAAAnDAAC at 0x0x7fffe5d2d268 data image columns = 0 data = 0x7fffe5d2d27c key image columns = 2 data = 0x7fffe5d2d27c [1] length=2 20 [2] length=16 6646dfsfdsdfsdfs 06:35:07 HR@messay > select * from test where rowid='AAAV9qAAEAAAAnDAAC'; ID NAME ---------------------------------------- ---------------------------------------- 20 6646dfsfdsdfsdfs
1.3 結論
SharePlex從事務開始即開始複製,從事務開始即複製並不是所有訊息都儲存在佇列,最後一條未提交訊息是不在佇列中的。
從事務開始複製,會加快佇列複製速度,但是對於大事務回滾來說,確實有一些不太友好。
2.Oracle Goldengate驗證
2.1 搭建一個本地到本地的簡單ogg環境
$ ./ggsci
GGSCI (single) 3> info all Program Status Group Lag at Chkpt Time Since Chkpt MANAGER RUNNING EXTRACT RUNNING DP_TAR 00:00:00 00:00:08 EXTRACT RUNNING EX_TAR 00:00:05 00:00:05 REPLICAT RUNNING RP_NEW 00:00:00 00:00:02 GGSCI (single) 4> view param ex_tar extract ex_tar setenv (NLS_LANG="AMERICAN_AMERICA.ZHS16GBK") setenv (ORACLE_SID="messay") setenv (ORACLE_HOME="/oracle/app/oracle/product/11.2/db_1") userid ogg,password ogg exttrail ./dirdat/rt GETUPDATEBEFORES GETTRUNCATES --BR BROFF BR BRINTERVAL 2H CACHEMGR CACHESIZE 100MB WARNLONGTRANS 2H,CHECKINTERVAL 5M TRANLOGOPTIONS INTEGRATEDPARAMS (max_sga_size 200, parallelism 2) --TRANLOGOPTIONS ARCHIVEDLOGONLY NUMFILES 4000 NOCOMPRESSUPDATES EOFDELAYCSECS 10 --TRANLOGOPTIONS DBLOGREADER TRANLOGOPTIONS PURGEORPHANEDTRANSACTIONS DYNAMICRESOLUTION discardfile ./dirrpt/ex_oth.dsc,append, megabytes 200 table hr.test;
2.2 源端測試表插入資料,第一條commit,第二條不commit
16:59:16 HR@messay > insert into test values(21,'aaa'); 17:06:50 HR@messay > commit; 17:06:53 HR@messay > insert into test values(22,'aaa');
2.3 使用logdump工具檢視源端佇列檔案內容
$ ./logdump Logdump 16 >ghdr on Logdump 17 >detail on Logdump 18 >filter filename HR.TEST Logdump 20 >open /ogg/dirdat/rt000014 Current LogTrail is /ogg/dirdat/rt000014 Logdump 21 >next ___________________________________________________________________ Hdr-Ind : E (x45) Partition : . (x04) UndoFlag : . (x00) BeforeAfter: A (x41) RecLength : 21 (x0015) IO Time : 2020/08/24 16:51:45.000.000 IOType : 5 (x05) OrigNode : 255 (xff) TransInd : . (x03) FormatType : R (x52) SyskeyLen : 0 (x00) Incomplete : . (x00) AuditRBA : 33 AuditPos : 16823312 Continued : N (x00) RecCount : 1 (x01) 2020/08/24 16:51:45.000.000 Insert Len 21 RBA 1091 Name: HR.TEST After Image: Partition 4 G s 0000 0006 0000 0002 3139 0001 0007 0000 0003 6161 | ........19........aa 61 | a Column 0 (x0000), Len 6 (x0006) Column 1 (x0001), Len 7 (x0007) Filtering suppressed 2 records Logdump 22 >next ___________________________________________________________________ Hdr-Ind : E (x45) Partition : . (x04) UndoFlag : . (x00) BeforeAfter: A (x41) RecLength : 21 (x0015) IO Time : 2020/08/24 16:59:16.000.000 IOType : 5 (x05) OrigNode : 255 (xff) TransInd : . (x03) FormatType : R (x52) SyskeyLen : 0 (x00) Incomplete : . (x00) AuditRBA : 33 AuditPos : 17503760 Continued : N (x00) RecCount : 1 (x01) 2020/08/24 16:59:16.000.000 Insert Len 21 RBA 1222 Name: HR.TEST After Image: Partition 4 G s 0000 0006 0000 0002 3230 0001 0007 0000 0003 6161 | ........20........aa 61 | a Column 0 (x0000), Len 6 (x0006) Column 1 (x0001), Len 7 (x0007) Logdump 23 >next ___________________________________________________________________ Hdr-Ind : E (x45) Partition : . (x04) UndoFlag : . (x00) BeforeAfter: A (x41) RecLength : 21 (x0015) IO Time : 2020/08/24 17:06:53.000.000 IOType : 5 (x05) OrigNode : 255 (xff) TransInd : . (x03) FormatType : R (x52) SyskeyLen : 0 (x00) Incomplete : . (x00) AuditRBA : 33 AuditPos : 20932112 Continued : N (x00) RecCount : 1 (x01) 2020/08/24 17:06:53.000.000 Insert Len 21 RBA 1355 Name: HR.TEST After Image: Partition 4 G s 0000 0006 0000 0002 3231 0001 0007 0000 0003 6161 | ........21........aa 61 | a Column 0 (x0000), Len 6 (x0006) Column 1 (x0001), Len 7 (x0007) Logdump 24 >next
# 可以看到只有21,沒有22的訊息,也就是OGG沒有捕獲未提交的事務。
# 將22記錄提交
19:07:24 HR@messay > commit;
# logdump繼續檢視
Logdump 25 >position first Reading forward from RBA 0 Logdump 26 >next ___________________________________________________________________ Hdr-Ind : E (x45) Partition : . (x04) UndoFlag : . (x00) BeforeAfter: A (x41) RecLength : 21 (x0015) IO Time : 2020/08/24 16:51:45.000.000 IOType : 5 (x05) OrigNode : 255 (xff) TransInd : . (x03) FormatType : R (x52) SyskeyLen : 0 (x00) Incomplete : . (x00) AuditRBA : 33 AuditPos : 16823312 Continued : N (x00) RecCount : 1 (x01) 2020/08/24 16:51:45.000.000 Insert Len 21 RBA 1091 Name: HR.TEST After Image: Partition 4 G s 0000 0006 0000 0002 3139 0001 0007 0000 0003 6161 | ........19........aa 61 | a Column 0 (x0000), Len 6 (x0006) Column 1 (x0001), Len 7 (x0007) Filtering suppressed 2 records Logdump 27 >next ___________________________________________________________________ Hdr-Ind : E (x45) Partition : . (x04) UndoFlag : . (x00) BeforeAfter: A (x41) RecLength : 21 (x0015) IO Time : 2020/08/24 16:59:16.000.000 IOType : 5 (x05) OrigNode : 255 (xff) TransInd : . (x03) FormatType : R (x52) SyskeyLen : 0 (x00) Incomplete : . (x00) AuditRBA : 33 AuditPos : 17503760 Continued : N (x00) RecCount : 1 (x01) 2020/08/24 16:59:16.000.000 Insert Len 21 RBA 1222 Name: HR.TEST After Image: Partition 4 G s 0000 0006 0000 0002 3230 0001 0007 0000 0003 6161 | ........20........aa 61 | a Column 0 (x0000), Len 6 (x0006) Column 1 (x0001), Len 7 (x0007) Logdump 28 >next ___________________________________________________________________ Hdr-Ind : E (x45) Partition : . (x04) UndoFlag : . (x00) BeforeAfter: A (x41) RecLength : 21 (x0015) IO Time : 2020/08/24 17:06:53.000.000 IOType : 5 (x05) OrigNode : 255 (xff) TransInd : . (x03) FormatType : R (x52) SyskeyLen : 0 (x00) Incomplete : . (x00) AuditRBA : 33 AuditPos : 20932112 Continued : N (x00) RecCount : 1 (x01) 2020/08/24 17:06:53.000.000 Insert Len 21 RBA 1355 Name: HR.TEST After Image: Partition 4 G s 0000 0006 0000 0002 3231 0001 0007 0000 0003 6161 | ........21........aa 61 | a Column 0 (x0000), Len 6 (x0006) Column 1 (x0001), Len 7 (x0007) Logdump 29 >next ___________________________________________________________________ Hdr-Ind : E (x45) Partition : . (x04) UndoFlag : . (x00) BeforeAfter: A (x41) RecLength : 21 (x0015) IO Time : 2020/08/24 19:10:18.000.000 IOType : 5 (x05) OrigNode : 255 (xff) TransInd : . (x03) FormatType : R (x52) SyskeyLen : 0 (x00) Incomplete : . (x00) AuditRBA : 33 AuditPos : 31403152 Continued : N (x00) RecCount : 1 (x01) 2020/08/24 19:10:18.000.000 Insert Len 21 RBA 1488 Name: HR.TEST After Image: Partition 4 G s 0000 0006 0000 0002 3232 0001 0007 0000 0003 6161 | ........22........aa 61 | a Column 0 (x0000), Len 6 (x0006) Column 1 (x0001), Len 7 (x0007) Logdump 30 >next Logdump 31 >
# 可以看到提交之後,trail佇列檔案中有了22的記錄。
2.4 繼續插入以及update不commit
2.4.1 繼續插入
19:10:18 HR@messay > insert into test values(23,'aaa'); 1 row created. Elapsed: 00:00:00.27 22:49:29 HR@messay > insert into test values(24,'aaa'); 1 row created. Elapsed: 00:00:00.00 22:49:33 HR@messay > insert into test values(25,'aaa'); 1 row created. Elapsed: 00:00:00.00 22:49:37 HR@messay > update test set name='hahahahaha' where id=25; 1 row updated.
2.4.2 logdump檢視
Logdump 34 >position first Reading forward from RBA 0 Logdump 35 >next ___________________________________________________________________ Hdr-Ind : E (x45) Partition : . (x04) UndoFlag : . (x00) BeforeAfter: A (x41) RecLength : 21 (x0015) IO Time : 2020/08/24 16:51:45.000.000 IOType : 5 (x05) OrigNode : 255 (xff) TransInd : . (x03) FormatType : R (x52) SyskeyLen : 0 (x00) Incomplete : . (x00) AuditRBA : 33 AuditPos : 16823312 Continued : N (x00) RecCount : 1 (x01) 2020/08/24 16:51:45.000.000 Insert Len 21 RBA 1091 Name: HR.TEST After Image: Partition 4 G s 0000 0006 0000 0002 3139 0001 0007 0000 0003 6161 | ........19........aa 61 | a Column 0 (x0000), Len 6 (x0006) Column 1 (x0001), Len 7 (x0007) Filtering suppressed 2 records Logdump 36 >next ___________________________________________________________________ Hdr-Ind : E (x45) Partition : . (x04) UndoFlag : . (x00) BeforeAfter: A (x41) RecLength : 21 (x0015) IO Time : 2020/08/24 16:59:16.000.000 IOType : 5 (x05) OrigNode : 255 (xff) TransInd : . (x03) FormatType : R (x52) SyskeyLen : 0 (x00) Incomplete : . (x00) AuditRBA : 33 AuditPos : 17503760 Continued : N (x00) RecCount : 1 (x01) 2020/08/24 16:59:16.000.000 Insert Len 21 RBA 1222 Name: HR.TEST After Image: Partition 4 G s 0000 0006 0000 0002 3230 0001 0007 0000 0003 6161 | ........20........aa 61 | a Column 0 (x0000), Len 6 (x0006) Column 1 (x0001), Len 7 (x0007) Logdump 37 >next ___________________________________________________________________ Hdr-Ind : E (x45) Partition : . (x04) UndoFlag : . (x00) BeforeAfter: A (x41) RecLength : 21 (x0015) IO Time : 2020/08/24 17:06:53.000.000 IOType : 5 (x05) OrigNode : 255 (xff) TransInd : . (x03) FormatType : R (x52) SyskeyLen : 0 (x00) Incomplete : . (x00) AuditRBA : 33 AuditPos : 20932112 Continued : N (x00) RecCount : 1 (x01) 2020/08/24 17:06:53.000.000 Insert Len 21 RBA 1355 Name: HR.TEST After Image: Partition 4 G s 0000 0006 0000 0002 3231 0001 0007 0000 0003 6161 | ........21........aa 61 | a Column 0 (x0000), Len 6 (x0006) Column 1 (x0001), Len 7 (x0007) Logdump 38 >next ___________________________________________________________________ Hdr-Ind : E (x45) Partition : . (x04) UndoFlag : . (x00) BeforeAfter: A (x41) RecLength : 21 (x0015) IO Time : 2020/08/24 19:10:18.000.000 IOType : 5 (x05) OrigNode : 255 (xff) TransInd : . (x03) FormatType : R (x52) SyskeyLen : 0 (x00) Incomplete : . (x00) AuditRBA : 33 AuditPos : 31403152 Continued : N (x00) RecCount : 1 (x01) 2020/08/24 19:10:18.000.000 Insert Len 21 RBA 1488 Name: HR.TEST After Image: Partition 4 G s 0000 0006 0000 0002 3232 0001 0007 0000 0003 6161 | ........22........aa 61 | a Column 0 (x0000), Len 6 (x0006) Column 1 (x0001), Len 7 (x0007) Logdump 39 >next Logdump 40 >
#可以看到並沒有更多的訊息,也就是不存在SharePlex的不記錄最後一條未提交事務訊息的情況。
2.5 結論
Oracle Goldengate只有在事務提交之後才會複製記錄到trail檔案中,對於大事務最終回滾的場景很友好,但是對於
大事務提交的場景,Oracle Goldengate確實做的不如SharePlex。
3 總結
(1)SharePlex在事務開始即開始複製
(2)OGG在事務提交之後開始複製
(3)對於大事務回滾的場景,SharePlex表現不如OGG,因為OGG如果事務最終回滾,OGG將不復制。
(4)對於大事務提交的場景,OGG表現是不如SharePlex的,因為OGG從COMMIT之後才開始寫入trail檔案,必然造成延遲。
(5)綜上,兩個軟體原理設計各有優缺點,Oracle Goldengate最近版本釋出更為穩定,對Oracle各個版本支援更為及時
並且與Oracle更為深度融合,複製效率越來越高,希望SharePlex未來也能越做越好,希望國產DSG也能越來越棒。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31439444/viewspace-2717675/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 事務複製會話 (三)會話
- 事務複製會話 (二)會話
- 事務複製會話 (四)會話
- 事務複製會話 (五)會話
- Orika - 類複製工具
- JavaBean的值複製工具JavaBean
- 複製管理工具介紹——高階複製
- MySQl事務建立,開始以及提交MySql
- TCPCopy 線上流量複製工具TCP
- Golang:deepcopy深複製工具庫Golang
- MySQL事務兩段式提交MySql
- SQL Server 2008配置對等事務複製SQLServer
- 基於 Ractor 模型最佳化事務複製回放效能模型
- percona之複製工具介紹
- 技術分享 | MySQL:從庫複製半個事務會怎麼樣?MySql
- 探究MySQL的DML提交事務的意義和DQL是否有必要提交事務MySql
- vitess兩階段提交事務Vite
- dimitri/pgcopydb:Postgres資料庫複製工具MITGC資料庫
- INFORMIX長事務及onstat工具用法ORM
- Redis主從複製那點事Redis
- 複製oracle home的注意事項Oracle
- OGG 複製程式拆分
- ABAP程式碼分析工具 - 事務碼SQF
- 【Azure Developer】一個複製Redis Key到另一個Redis服務的工具(redis_copy_net8)DeveloperRedis
- Redis 實戰 —— 07. 複製、處理故障、事務及效能優化Redis優化
- 蘋果Mac移動複製檔案效率工具:Yoink蘋果Mac
- 假期充電 Day 1 —— 多次複製貼上工具
- 好用的IdCardNumberMethod工具類(直接複製使用)
- 聊一聊web前端那些事兒,關於深複製和淺複製Web前端
- Spring分散式事務XA事務(兩段提交2PC)實現Spring分散式
- Solon 的事務管理工具類(TranUtils)
- SQL Server 查出未提交事務(長事務)SQLSQLServer
- 分散式事務(二)之兩階段提交分散式
- Paste Queue for Mac(多次複製貼上工具)v1.4.2ASTMac
- 淺複製和深複製的概念與值複製和指標複製(引用複製)有關 淺複製 “指標複製 深複製 值複製指標
- OGG雙向DML複製操作
- OGG單向DDL複製操作
- mysql複製那點事(2)-binlog組提交原始碼分析和實現MySql原始碼