學習自葉大blog
例子和解釋都很詳細,不再改動,僅作筆記。
//db2的連線
db2, err := sql.open("
mysql
", "
root:123456@tcp(127.0.0.1:3307)/hade2")
if err !=nil
defer db2.close()
//開始前顯示
var score int
db1.queryrow(
"select score from user where id = 1
").scan(&score)
fmt.println(
"user1 score:
", score)
varmoney float64
db2.queryrow(
"select money from wallet where id = 1
").scan(&money)
fmt.println(
"wallet1 money:
", money)
//生成xid
xid := strconv.formatint(time.now().unix(), 10
) fmt.println(
"=== xid:
" + xid + "
====")
defer func()
db1.queryrow(
"select score from user where id = 1
").scan(&score)
fmt.println(
"user1 score:
", score)
db2.queryrow(
"select money from wallet where id = 1
").scan(&money)
fmt.println(
"wallet1 money:
", money)
}()//xa 啟動
fmt.println("
=== call start ====")
if _, err = db1.exec(fmt.sprintf("
xa start '%s'
", xid)); err !=nil
if _, err = db2.exec(fmt.sprintf("
xa start '%s'
", xid)); err !=nil
//dml操作
if _, err = db1.exec("
update user set score=score+2 where id =1
"); err !=nil
if _, err = db2.exec("
update wallet set money=money+1.2 where id=1
"); err !=nil
//xa end
fmt.println("
=== call end ====")
if _, err = db1.exec(fmt.sprintf("
xa end '%s'
", xid)); err !=nil
if _, err = db2.exec(fmt.sprintf("
xa end '%s'
", xid)); err !=nil
//prepare
fmt.println("
=== call prepare ====")
if _, err = db1.exec(fmt.sprintf("
xa prepare '%s'
", xid)); err !=nil
//panic(errors.new("db2 prepare error"))
if _, err = db2.exec(fmt.sprintf("
xa prepare '%s'
", xid)); err !=nil
//commit
fmt.println("
=== call commit ====")
if _, err = db1.exec(fmt.sprintf("
xa commit '%s'
", xid)); err !=nil
//panic(errors.new("db2 commit error"))
if _, err = db2.exec(fmt.sprintf("
xa commit '%s'
", xid)); err !=nil
db1.queryrow(
"select score from user where id = 1
").scan(&score)
fmt.println(
"user1 score:
", score)
db2.queryrow(
"select money from wallet where id = 1
").scan(&money)
fmt.println(
"wallet1 money:
", money)
}當出現特定的log,我們可以在mysql終端執行
xa recover這樣可以看到一些失敗的commit,所以我們根據情況可以手動commit
xa commit '業務中盡量不要用分布式儲存,盡可能的用佇列來替代,因為這個事務一致性前者太難保障。1585644880
'
end
MySQL 兩階段提交
在mysql中,所謂的兩階段提交就是redo log和binlog 兩個階段的commit過程。在兩階段提交的不同時刻,mysql 異常重啟會出現什麼現象?1 在時刻 a 發生宕機,也就是寫入 redo log 處於 prepare 階段之後 寫 binlog 之前,發生了崩潰 crash 由於此時...
mysql5 7兩階段提交 mysql兩階段提交
1.兩階段提交 mysql中經常說的wal技術,wal的全稱是write ahead logging,它的關鍵點就是先寫日誌,再寫磁碟。即當有一條記錄需要更新時,innodb引擎就會先把記錄寫到redo log裡,並更新記憶體,這個時候更新就完成了。因為如果每一次的更新操作都需要寫進磁碟,然後磁碟也...
兩階段提交
1 二階段提交協議 一般分為協調器c和若干事務執行者si兩種角色 當執行某一事務t的所有站點si都通知c事務執行完成,c即啟動二階段提交協議。1.首先c向所有si發訊息 c先將訊息寫到本機日誌 si收到訊息後,根據本機t的執 況,如果成功返回,不成功返回。返回前都應把要返回的訊息寫到日誌裡 2.c收...