No. It is not normal that your writer cannot release a transaction until all readers exit database.
This begs a question: just how you open the database file?
The sqlite engine does have ability to open database in readonly mode:
https://www.sqlite.org/c3ref/open.html
sqlite3 *db;
sqlite3_open_v2("mydb.dat", &db, SQLITE_OPEN_READONLY, NULL);
The default flags (third parameter) however are SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE.
If you have one application opening file in normal SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE. And multiple applications opening in SQLITE_OPEN_READONLY mode, then writer should not wait for readers. It wont even know about them.
If you can, try doing your queries with sqlite3 console tool. It has a --readonly option, which will really open database file in readonly mode.
However, if you are working not in C, but in some language binding - it could be, that the file is always opened normally and then switched to read-only mode in the binding level.
From a formal point of view, the select statement can put a lock to a table schema, so one user cannot do alter table while another user is selecting from it. But it is the only real lock the reader can put on a table.
The only lock the sqlite does in read-only mode is to prevent database file to be deleted.
It can also be good to read about shared cache mode: https://www.sqlite.org/sharedcache.html Which can be done in some cases, and it also has ability to interfere with transactions if they are based on the same cache.