Параллелизм MYSQL выбирает и обновляет

Я не могу понять, как выбрать, а затем обновить таблицу с несколькими горутинами. В документации для db и stmt сказано: «безопасно для одновременного использования несколькими горутинами». Также я использую транзакции, но безуспешно. Я хочу запустить 7 горутин и взять каждую строку.

Данные

+--------+-----------+---------------------+
| idTest | someValue | date                |
+--------+-----------+---------------------+
|      1 | 1         | 2019-06-11 11:29:42 |
|      2 | 2         | 2019-06-11 11:29:42 |
|      3 | 3         | NULL                |
|      4 | 4         | NULL                |
|      5 | 5         | NULL                |
|      6 | 6         | NULL                |
|      7 | 7         | NULL                |
+--------+-----------+---------------------+

текущий код

db, err := sql.Open("mysql", strConn)
if err != nil {
    fmt.Printf("Troubles in connaction! %s", err)
}

var idTest int
var someValue string

stmt, err := db.Prepare("select idTest,someValue from test where date is null limit 1")
CheckError(err)

defer stmt.Close()

rows, err := stmt.Query()
CheckError(err)

defer rows.Close()

for rows.Next() {
    rows.Scan(&idTest, &someValue)

    stmt, err = db.Prepare("update test set date = now() where idTest= ?")
    CheckError(err)
    _, err = stmt.Exec(idTest)
    CheckError(err)
}

Каждая горутина имеет db.conn и иногда пытается выбрать и обновить таблицу.

func main() {
    for i := 0; i < 7; i++ {
        dbConn := "blabla"
        go ChildBot(dbConn)
    }
    var input string
    fmt.Scanln(&input)
}
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
0
102
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

вы должны прочитать данные, а затем запустить горутину.

for rows.Next() {
    rows.Scan(&idTest, &someValue)
    go func(idTest int) {
         stmt, err = db.Prepare("update test set date = now() where idTest= ?")
         CheckError(err)
         _, err = stmt.Exec(idTest)
         CheckError(err)
    }(idTest)
}

это сделано таким образом, потому что вы должны сначала прочитать данные, прежде чем что-либо с ними делать. В противном случае следующее чтение может время от времени переопределять ваше предыдущее значение.

У меня есть 7 горутин с установленной базой данных для каждой горутины. И каждая горутина вызывает эту функцию для выбора и обновления. В .net у меня нет этой проблемы с транзакциями и sql.Open/Close :( Потому что выберите строки блока и другие транзакции, ожидающие окончания предыдущей транзакции.

Alina 11.06.2019 13:33

Похоже, пришло время изучить параллелизм и использование блочных каналов.

Alina 11.06.2019 13:52

Другие вопросы по теме