2017-03-19 20 views
0

私は約100リック/秒のシステムを持っています。そして、私はgoプログラムを再開するまで応答しないことがあります。私はトランザクションを開いて、いくつかの場所でそれを閉じないので、これがわかった。これは、中断することなく月の私のプログラムの仕事をしたゴラン取引終了処理

私はこのコードを追加
defer func() { 
if r := recover(); r != nil { 
    tx.Rollback() 
    return 
} 

if err == nil { 
    err = tx.Commit() 
} else { 
    tx.Rollback() 
} 
}() 

すべての接続が開かれたトランザクションによって占有された理由ですし、私はこの後に別のものを開くことができませんでした。しかし、今は再びそれが起こった。おそらくこの問題が原因です。トランザクションを閉じるためのより良い方法はありますか?それが1分間開いていたらトランザクションを終了する方法ですか?

+0

エラーは何ですか?また、ちょうどsidenoteですが、 'Rollback'もエラーを返すことができるので、それを処理する必要があります。 – MahlerFive

+0

@MahlerFive、私はまだ確信が持てません。パニックになり、実行を停止させます。はい、ロールバックとコミットもエラーを返しますが、私はそれらの処理方法がわかりません。 –

+0

全体機能を投稿できますか? – MahlerFive

答えて

0

トランザクションを1分後にロールバックする場合は、標準のGoタイムアウトパターン(下記)を使用できます。

しかし、あなたの問題に対処するより良い方法があるかもしれません。あなたはそれに関する多くの情報を提供していませんが、おそらくコンテキストで標準のHTTPリクエストを使用しています。その場合は、a transaction started within a context is automatically rolled back when the context is cancelledを知るのに役立ちます。何か問題が発生した場合にコンテキストがキャンセルされるようにする方法の1つは、deadlineです。 Channels - Timeoutsより抜粋


。元の著者はChris Lucas,Kwarrtz,Rodolfo Carvalhoであった。帰属の詳細はcontributor pageにあります。ソースはCC BY-SA 3.0でライセンスされており、Documentation archiveにあります。リファレンストピックID:1263と例ID:6050

タイムアウト

チャンネルは、多くの場合、タイムアウトを実装するために使用されています。

func main() { 
    // Create a buffered channel to prevent a goroutine leak. The buffer 
    // ensures that the goroutine below can eventually terminate, even if 
    // the timeout is met. Without the buffer, the send on the channel 
    // blocks forever, waiting for a read that will never happen, and the 
    // goroutine is leaked. 
    ch := make(chan struct{}, 1) 

    go func() { 
     time.Sleep(10 * time.Second) 
     ch <- struct{}{} 
    }() 

    select { 
    case <-ch: 
     // Work completed before timeout. 
    case <-time.After(1 * time.Second): 
     // Work was not completed after 1 second. 
    } 
} 
+0

使用例を教えてください。私はインターネット上で何も見つけられませんでした –

+0

コンテキストを使用する方法の例は、Golangのブログ(https://blog.golang.org/context)で利用でき、コンテキストパッケージ自体はよく書かれています(https:// golang。 org/pkg/context /)を参照してください。 – Zoyd

関連する問題