Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Handle writes to auto-vacuum databases within UNLOCKED transactions in the same way as for non-UNLOCKED transactions. |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | begin-concurrent |
Files: | files | file ages | folders |
SHA1: |
de1ea450db33b140b11af5b801ea6a15 |
User & Date: | dan 2015-08-15 18:16:46.463 |
Context
2015-08-19
| ||
20:27 | When committing an unlocked transaction, relocate newly allocated database pages within the file to avoid conflicting with committed transactions. There are lots of things still to fix in this code. (check-in: 3bbc31d515 user: dan tags: begin-concurrent) | |
2015-08-15
| ||
18:16 | Handle writes to auto-vacuum databases within UNLOCKED transactions in the same way as for non-UNLOCKED transactions. (check-in: de1ea450db user: dan tags: begin-concurrent) | |
2015-07-29
| ||
12:14 | Only allow UNLOCKED transactions to commit if none of the pages read by the transaction have been modified since it was opened. (check-in: 0b9718426e user: dan tags: begin-concurrent) | |
Changes
Changes to src/btree.c.
︙ | ︙ | |||
3138 3139 3140 3141 3142 3143 3144 3145 | */ while( pBt->pPage1==0 && SQLITE_OK==(rc = lockBtree(pBt)) ); if( rc==SQLITE_OK && wrflag ){ if( (pBt->btsFlags & BTS_READ_ONLY)!=0 ){ rc = SQLITE_READONLY; }else{ int bSubjInMem = sqlite3TempInMemory(p->db); | > < | 3138 3139 3140 3141 3142 3143 3144 3145 3146 3147 3148 3149 3150 3151 3152 3153 | */ while( pBt->pPage1==0 && SQLITE_OK==(rc = lockBtree(pBt)) ); if( rc==SQLITE_OK && wrflag ){ if( (pBt->btsFlags & BTS_READ_ONLY)!=0 ){ rc = SQLITE_READONLY; }else{ int exFlag = (p->db->bUnlocked && !ISAUTOVACUUM) ? -1 : (wrflag>1); int bSubjInMem = sqlite3TempInMemory(p->db); assert( p->db->bUnlocked==0 || wrflag==1 ); rc = sqlite3PagerBegin(pBt->pPager, exFlag, bSubjInMem); if( rc==SQLITE_OK ){ rc = newDatabase(pBt); } } } |
︙ | ︙ |
Changes to test/unlocked.test.
︙ | ︙ | |||
111 112 113 114 115 116 117 118 119 120 121 122 123 124 | BEGIN UNLOCKED; $sql " {1 {cannot modify database schema - UNLOCKED transaction}} do_execsql_test 1.7.$tn.2 ROLLBACK } do_multiclient_test tn { #----------------------------------------------------------------------- # 1. Start an UNLOCKED transaction using [db1]. # # 2. Start and then rollback a regular transaction using [db2]. This | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 | BEGIN UNLOCKED; $sql " {1 {cannot modify database schema - UNLOCKED transaction}} do_execsql_test 1.7.$tn.2 ROLLBACK } #------------------------------------------------------------------------- # If an auto-vacuum database is written within an UNLOCKED transaction, it # is handled in the same way as for a non-UNLOCKED transaction. # reset_db do_execsql_test 1.8.1 { PRAGMA auto_vacuum = 1; PRAGMA journal_mode = wal; CREATE TABLE t1(x, y); INSERT INTO t1 VALUES('x', 'y'); } {wal} do_execsql_test 1.8.2 { BEGIN UNLOCKED; SELECT * FROM t1; COMMIT; } {x y} do_catchsql_test 1.8.3 { BEGIN UNLOCKED; INSERT INTO t1 VALUES('a', 'b'); } {0 {}} do_test 1.8.4 { sqlite3 db2 test.db catchsql { BEGIN UNLOCKED; INSERT INTO t1 VALUES('c', 'd'); } db2 } {1 {database is locked}} do_test 1.8.5 { db eval COMMIT db2 eval COMMIT } {} do_multiclient_test tn { #----------------------------------------------------------------------- # 1. Start an UNLOCKED transaction using [db1]. # # 2. Start and then rollback a regular transaction using [db2]. This |
︙ | ︙ |