Deadlocks
Due to a nature of multi-statement transactions deadlocks are possible. Deadlocks are not automatically handled. Transaction object procedure deadlock can be used to check if the transaction is in deadlock.
When a deadlock happens, transactions stays in Lock state.
Example:
void *db = sp_getobject(env, "db.database");
void *a = sp_begin(env);
void *b = sp_begin(env);
uint32_t key = 7;
void *o = sp_document(db);
sp_setstring(o, "key", &key, sizeof(key));
sp_set(a, o);
key = 8;
o = sp_document(db);
sp_setstring(o, "key", &key, sizeof(key));
sp_set(b, o);
o = sp_document(db);
sp_setstring(o, "key", &key, sizeof(key));
sp_set(a, o);
key = 7;
o = sp_document(db);
sp_setstring(o, "key", &key, sizeof(key));
sp_set(b, o);
sp_commit(a) == 2; /* lock */
sp_commit(b) == 2; /* lock */
sp_getint(a, "deadlock") == 1;
sp_getint(b, "deadlock") == 1;
sp_destroy(a);
sp_getint(b, "deadlock") == 0;
sp_commit(b) == 0; /* ok */