MySQL兩階段提交

2022-06-10 12:30:14 字數 3159 閱讀 9440

學習自葉大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收...