powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Sqlite, transactions, не коммитятся транзакции.
2 сообщений из 2, страница 1 из 1
Sqlite, transactions, не коммитятся транзакции.
    #35967534
Ibolit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.
Написал, как водится, крутую прогу, и решил потестить. Для этого решил создать базу данных с миллионом записей. А чтобы процесс не растянулся на неделю, решил завернуть инсерты в транзакцию.
В результате: транзакция создается, инсерты срабатывают (возвращают SQLITE_DONE), но транзакция не коммитится. В чем может быть дело? Все логи говорят о том, что проходят все запросы, кроме коммита. Все возвращают SQLITE_DONE... Почему не работает - ума не приложу.

Ниже -- код на Objective-C, который все это делает.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
- (void) populateDbWithDummyData {
	NSArray *chars = [NSArray arrayWithObjects:@"a", @"b", @"c", @"d", @"e", @"f", @"g", @"h", @"i", @"j", @"k", @"l", @"m", @"n", @"o", @"p", @"q", @"r", @"s", @"t", @"u", @"v", @"w", @"x", @"y", @"z", @" ", nil];
	NSMutableString *s = [[NSMutableString alloc]initWithString:@""]; 
	
	[self beginTransaction];
	
	for (int i =  30 ; i <  100 ; i++) {
		int a = i;
		while (a >  0 ) {
			int b = (a %  27 );
			a = a /  27 ;
			[s appendFormat:@"%@", [chars objectAtIndex:b]];
		}
		NSString *bs= [NSString stringWithFormat:@"%@ - translation of %@", s, s];
		BOOL b = [self writeToDbOriginal: s andTranslation:bs];
		if (!b) {
			NSLog(@"b is not yes;");
		}
		
		
		if (i %  10000  ==  0 ) {
			NSLog(@"I is %i, the final string is %@", i, s);
			[self commitTransaction];
			NSLog(@"Just tried to commit");
			[self beginTransaction];
		}	
		[s replaceCharactersInRange:NSMakeRange( 0 , s.length) withString:@""];
	}
	[self commitTransaction];
	[s release];
}


- (int) beginTransaction {

	const char *beginSql = "BEGIN";
	int success = sqlite3_exec(database, beginSql,  0 ,  0 ,  0 );
	if (success != SQLITE_OK) {
		NSLog(@"Sqlite error code is : %i, %s",sqlite3_errcode(database), sqlite3_errmsg(database));
	}
	return success;
}

- (int) commitTransaction {

	const char *commitSql = "COMMIT";
	BOOL retry = NO;
	int success;
	int numOfRetries =  1000000 ;
	do {
		success = sqlite3_exec(database, commitSql,  0 ,  0 ,  0 );
		if (success != SQLITE_OK) {
			retry = YES;
			numOfRetries--;
		}
		
	} while (retry && numOfRetries >  0 );
	
	int y = sqlite3_get_autocommit(database);
	if (numOfRetries ==  0 ) {
		NSLog (@"Couldn\'t close the database, it seems to be still busy. success: %i, errcode: %i, errmsg: %s, autocommit: %i'", success, sqlite3_errcode(database), sqlite3_errmsg(database), y);
	}
	NSLog(@"Num of retries left: %d", numOfRetries);
	return success;
}


- (BOOL) writeToDbOriginal: (NSString *) orig andTranslation: (NSString *) tran {
	@synchronized(self) {
		sqlite3_bind_text(writeEnglish,  1 , [orig cStringUsingEncoding:NSUTF8StringEncoding], - 1 , SQLITE_TRANSIENT);
		int lastOrig = [self execStatement:writeEnglish];
		sqlite3_bind_text(writeRussian,  1 , [tran cStringUsingEncoding:NSUTF8StringEncoding], - 1 , SQLITE_TRANSIENT);
		int lastTran = [self execStatement:writeRussian];
		
		if (lastOrig <=  0 ) {
			NSLog(@"We are about to getRowidFromSTMT (lastOrig)");
			lastOrig = [self rowidFromStmt:getOrigID andText:orig];
		}
		
		if (lastTran <=  0 ) {
			NSLog(@"We are about to getRowidFromSTMT (lastTran)");
			lastTran = [self rowidFromStmt:getTranID andText:tran];
		}
		
		if (lastOrig >  0  && lastTran >  0 ) {
			sqlite3_bind_int(writePair,  1 , lastOrig);
			sqlite3_bind_int(writePair,  2 , lastTran);
			int wp = [self execStatement:writePair];
			if (wp >  0 ) {
				
				return YES;
			}
			NSLog(@"Fail in method on line 70 in Database.");
			return NO;
		}
	}
	NSLog(@"Fail in method on line 70 in Database. We are out of syncronized.");
	return NO;
}

- (int) execStatement: (sqlite3_stmt *)stmt {
	@synchronized(self) {
		int ret = - 1 ;

		int success = sqlite3_step (stmt);
		if (success == SQLITE_DONE) {
			ret = sqlite3_last_insert_rowid(database);
//			NSLog(@"Finished in DONE");
		} else  if (success == SQLITE_OK) {
			NSLog(@"Finished in OK");
			ret =  0 ;
		} else {
			NSLog(@"The error in the dabase is --- %i ---,  %s", success, sqlite3_errmsg(database));
		}
		
//		NSLog(@"The current stmt is '%s'", sqlite3_sql(stmt));
		
		sqlite3_reset(stmt);
		sqlite3_clear_bindings(stmt);
		return ret;
	}
	return - 2 ;
}




...
Рейтинг: 0 / 0
Sqlite, transactions, не коммитятся транзакции.
    #35967583
Ibolit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, забыл оставить лог:

2009-05-04 17:23:24.126 Mtran.2[1599:10b] Database was opened at /Multitran/dababase.sqlite3
2009-05-04 17:23:27.648 Mtran.2[1599:10b] Couldn't close the database, it seems to be still busy. success: 1, errcode: 1, errmsg: cannot commit transaction - SQL statements in progress, autocommit: 0
2009-05-04 17:23:27.648 Mtran.2[1599:10b] Num of retries left: 0
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Sqlite, transactions, не коммитятся транзакции.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]