This should all be wrapped in a transaction, I think it would look like:

```python
with self.engine.begin() as conn:
    existing_project = self.get_project(name)
    
    if existing_project:
        message = "updating project {0}".format(existing_project['name'])
        query = (packages.update()
                 .where(packages.c.name == existing_project['name']))
    else:
        message = "create"
        query = packages.insert()

    conn.execute(query.values(
        name=name,
        normalized_name=utils.validate_and_normalize_package_name(name),
        **additional_columns
    ))

    self._insert_journal_entry(name, None, message, username, user_ip)
```