Assuming self.dbconn is a connection produced by engine.connect(), you can use it as a context manager, which commits when it exits:
names = ['Alice', 'Bob', 'Carol']
with engine.connect() as conn:
with conn.begin():
for name in names:
conn.execute(users.insert(), name=name)
The code snippet produces this output, showing each insert takes place within a single transaction:
2020-12-06 17:16:36,683 INFO sqlalchemy.engine.Engine BEGIN (implicit)
2020-12-06 17:16:36,683 INFO sqlalchemy.engine.Engine INSERT INTO users (name) VALUES (?)
2020-12-06 17:16:36,684 INFO sqlalchemy.engine.Engine [generated in 0.00019s] ('Alice',)
2020-12-06 17:16:36,684 INFO sqlalchemy.engine.Engine INSERT INTO users (name) VALUES (?)
2020-12-06 17:16:36,684 INFO sqlalchemy.engine.Engine [cached since 0.0006672s ago] ('Bob',)
2020-12-06 17:16:36,684 INFO sqlalchemy.engine.Engine INSERT INTO users (name) VALUES (?)
2020-12-06 17:16:36,684 INFO sqlalchemy.engine.Engine [cached since 0.0009919s ago] ('Carol',)
2020-12-06 17:16:36,684 INFO sqlalchemy.engine.Engine COMMIT
See the docs here.
If we change the last element in the list to something that can't be saved - for example the built-in int function - the entire transaction is rolled back
2020-12-06 17:21:50,760 INFO sqlalchemy.engine.Engine BEGIN (implicit)
2020-12-06 17:21:50,761 INFO sqlalchemy.engine.Engine INSERT INTO users (name) VALUES (?)
2020-12-06 17:21:50,761 INFO sqlalchemy.engine.Engine [generated in 0.00019s] ('Alice',)
2020-12-06 17:21:50,761 INFO sqlalchemy.engine.Engine INSERT INTO users (name) VALUES (?)
2020-12-06 17:21:50,761 INFO sqlalchemy.engine.Engine [cached since 0.0006409s ago] ('Bob',)
2020-12-06 17:21:50,761 INFO sqlalchemy.engine.Engine INSERT INTO users (name) VALUES (?)
2020-12-06 17:21:50,761 INFO sqlalchemy.engine.Engine [cached since 0.0009716s ago] (<class 'int'>,)
2020-12-06 17:21:50,762 INFO sqlalchemy.engine.Engine ROLLBACK