12

テーブルに複数のレコードを挿入するトランザクションを開始します。トランザクションがコミットされる前に、データベースから最後に挿入されたレコードを選択できますか?

4

2 に答える 2

18

はい。

トランザクション内では、アプリケーションはすべてを認識します。

ただし、他のトランザクションには変更の一部が表示されません。

トランザクションのポイントは、一連のステートメントをデータベースに対する1つのアトミックな変更のように見せることです。

コミットすると、トランザクション内のすべてのステートメントが完成し、他のすべての人がその効果を確認できます。

ロールバックした場合、トランザクション内のステートメントはファイナライズされず、データベースに変更は発生しません。

ところで、すべてのステートメントがトランザクションの一部になるわけではありません。DDL(たとえば、作成と削除)は、以前のトランザクションをすべて終了します。

于 2008-12-18T03:03:27.680 に答える
7

はい、トランザクション中またはトランザクション後に last_insert_rowid() 関数を使用できます。

last_insert_rowid() 関数は、関数を呼び出したデータベース接続から挿入された最後の行の ROWID を返します。

言い換えると:

SQLite version 3.6.23
Enter ".help" for instructions
Enter SQL statements terminated with a ";"

sqlite> create table T (C);
sqlite> insert into T values ('hello');
sqlite> select last_insert_rowid();
1
sqlite> BEGIN;
sqlite> insert into T values ('test 2');
sqlite> select last_insert_rowid();
2
sqlite> select rowid,* from T;
1|hello
2|test 2
sqlite> ROLLBACK;
sqlite> select last_insert_rowid();
2
sqlite> select rowid,* from T;
1|hello
sqlite>
于 2010-04-16T23:43:44.990 に答える