同一个goroutine同时使用事务和非事务,在并发的情况会导致死锁 #2166

Open
opened 2022-08-17 14:40:14 +00:00 by ipanyiwen · 0 comments

使用的版本: xorm.io/xorm v1.3.1
配置和测试代码如下:

数据库初始化配置: 
{
			Username:     "root",
			Password:     "****",
			DbURL:        "ip:port",
			Schema:       "test",
			MaxOpenConns: 10,
			MaxIdleConns: 5,
			ShowSql:      true,
}

func test() {
	wg := sync.WaitGroup{}
	for i := 0; i < 10; i++ {
		wg.Add(1)
		go func() {
			transaction()
			wg.Done()
		}()
	}
	wg.Wait()
	fmt.Println("finish........")
}

func transaction() error {
	s1 := mysql.EngineGroup.NewSession()
	s1.Begin()
	res, err := s1.Exec("select * from test where name = ?", "test")
	if err != nil {
		s1.Rollback()
		return err
	}
	fmt.Println(res.RowsAffected())
	// 并发执行这个语句死锁
	mysql.EngineGroup.Exec("select * from test1 where name = ?", "test")
	s1.Commit()
	return nil
}

返回结果: 一直卡在最后
=== RUN TestFind
[xorm] [info] 2022/08/17 22:42:30.046050 PING DATABASE mysql
[xorm] [info] 2022/08/17 22:42:30.048720 PING DATABASE mysql
time="2022-08-17T22:42:30+08:00" level=info msg="Init db mysql finish..."
[xorm] [info] 2022/08/17 22:42:30.050694 [SQL] BEGIN TRANSACTION [] - 473.68µs
[xorm] [info] 2022/08/17 22:42:30.051825 [SQL] BEGIN TRANSACTION [] - 1.596799ms
[xorm] [info] 2022/08/17 22:42:30.051985 [SQL] BEGIN TRANSACTION [] - 1.782754ms
[xorm] [info] 2022/08/17 22:42:30.052098 [SQL] BEGIN TRANSACTION [] - 1.827874ms
[xorm] [info] 2022/08/17 22:42:30.052272 [SQL] BEGIN TRANSACTION [] - 2.007615ms
[xorm] [info] 2022/08/17 22:42:30.052277 [SQL] BEGIN TRANSACTION [] - 1.883392ms
[xorm] [info] 2022/08/17 22:42:30.052333 [SQL] BEGIN TRANSACTION [] - 2.062269ms
[xorm] [info] 2022/08/17 22:42:30.052352 [SQL] BEGIN TRANSACTION [] - 2.109794ms
[xorm] [info] 2022/08/17 22:42:30.052471 [SQL] BEGIN TRANSACTION [] - 2.278203ms
[xorm] [info] 2022/08/17 22:42:30.052624 [SQL] BEGIN TRANSACTION [] - 2.31885ms
[xorm] [info] 2022/08/17 22:42:30.065664 [SQL] select * from test where name = ? [test] - 13.157778ms
0
[xorm] [info] 2022/08/17 22:42:30.065698 [SQL] select * from test where name = ? [test] - 13.066802ms
0
[xorm] [info] 2022/08/17 22:42:30.065701 [SQL] select * from test where name = ? [test] - 13.416414ms
0
[xorm] [info] 2022/08/17 22:42:30.065671 [SQL] select * from test where name = ? [test] - 13.549105ms
0
[xorm] [info] 2022/08/17 22:42:30.065739 [SQL] select * from test where name = ? [test] - 14.996209ms
0
[xorm] [info] 2022/08/17 22:42:30.065671 [SQL] select * from test where name = ? [test] - 13.825816ms
0
[xorm] [info] 2022/08/17 22:42:30.070316 [SQL] select * from test where name = ? [test] - 17.956807ms
0
[xorm] [info] 2022/08/17 22:42:30.070343 [SQL] select * from test where name = ? [test] - 18.33531ms
0
[xorm] [info] 2022/08/17 22:42:30.071286 [SQL] select * from test where name = ? [test] - 19.002789ms
0
[xorm] [info] 2022/08/17 22:42:30.071319 [SQL] select * from test where name = ? [test] - 18.939498ms
0

使用的版本: xorm.io/xorm v1.3.1 配置和测试代码如下: ``` 数据库初始化配置: { Username: "root", Password: "****", DbURL: "ip:port", Schema: "test", MaxOpenConns: 10, MaxIdleConns: 5, ShowSql: true, } func test() { wg := sync.WaitGroup{} for i := 0; i < 10; i++ { wg.Add(1) go func() { transaction() wg.Done() }() } wg.Wait() fmt.Println("finish........") } func transaction() error { s1 := mysql.EngineGroup.NewSession() s1.Begin() res, err := s1.Exec("select * from test where name = ?", "test") if err != nil { s1.Rollback() return err } fmt.Println(res.RowsAffected()) // 并发执行这个语句死锁 mysql.EngineGroup.Exec("select * from test1 where name = ?", "test") s1.Commit() return nil } ``` 返回结果: 一直卡在最后 === RUN TestFind [xorm] [info] 2022/08/17 22:42:30.046050 PING DATABASE mysql [xorm] [info] 2022/08/17 22:42:30.048720 PING DATABASE mysql time="2022-08-17T22:42:30+08:00" level=info msg="Init db mysql finish..." [xorm] [info] 2022/08/17 22:42:30.050694 [SQL] BEGIN TRANSACTION [] - 473.68µs [xorm] [info] 2022/08/17 22:42:30.051825 [SQL] BEGIN TRANSACTION [] - 1.596799ms [xorm] [info] 2022/08/17 22:42:30.051985 [SQL] BEGIN TRANSACTION [] - 1.782754ms [xorm] [info] 2022/08/17 22:42:30.052098 [SQL] BEGIN TRANSACTION [] - 1.827874ms [xorm] [info] 2022/08/17 22:42:30.052272 [SQL] BEGIN TRANSACTION [] - 2.007615ms [xorm] [info] 2022/08/17 22:42:30.052277 [SQL] BEGIN TRANSACTION [] - 1.883392ms [xorm] [info] 2022/08/17 22:42:30.052333 [SQL] BEGIN TRANSACTION [] - 2.062269ms [xorm] [info] 2022/08/17 22:42:30.052352 [SQL] BEGIN TRANSACTION [] - 2.109794ms [xorm] [info] 2022/08/17 22:42:30.052471 [SQL] BEGIN TRANSACTION [] - 2.278203ms [xorm] [info] 2022/08/17 22:42:30.052624 [SQL] BEGIN TRANSACTION [] - 2.31885ms [xorm] [info] 2022/08/17 22:42:30.065664 [SQL] select * from test where name = ? [test] - 13.157778ms 0 <nil> [xorm] [info] 2022/08/17 22:42:30.065698 [SQL] select * from test where name = ? [test] - 13.066802ms 0 <nil> [xorm] [info] 2022/08/17 22:42:30.065701 [SQL] select * from test where name = ? [test] - 13.416414ms 0 <nil> [xorm] [info] 2022/08/17 22:42:30.065671 [SQL] select * from test where name = ? [test] - 13.549105ms 0 <nil> [xorm] [info] 2022/08/17 22:42:30.065739 [SQL] select * from test where name = ? [test] - 14.996209ms 0 <nil> [xorm] [info] 2022/08/17 22:42:30.065671 [SQL] select * from test where name = ? [test] - 13.825816ms 0 <nil> [xorm] [info] 2022/08/17 22:42:30.070316 [SQL] select * from test where name = ? [test] - 17.956807ms 0 <nil> [xorm] [info] 2022/08/17 22:42:30.070343 [SQL] select * from test where name = ? [test] - 18.33531ms 0 <nil> [xorm] [info] 2022/08/17 22:42:30.071286 [SQL] select * from test where name = ? [test] - 19.002789ms 0 <nil> [xorm] [info] 2022/08/17 22:42:30.071319 [SQL] select * from test where name = ? [test] - 18.939498ms 0 <nil>
Sign in to join this conversation.
No Milestone
No Assignees
1 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.

No due date set.

Dependencies

No dependencies set.

Reference: xorm/xorm#2166
No description provided.