@@ -531,6 +531,16 @@ async def append_event(self, session: Session, event: Event) -> Event:
531531 schema = self ._get_schema_classes ()
532532 is_sqlite = self .db_engine .dialect .name == _SQLITE_DIALECT
533533 use_row_level_locking = self ._supports_row_level_locking ()
534+
535+ state_delta = (
536+ event .actions .state_delta
537+ if event .actions and event .actions .state_delta
538+ else {}
539+ )
540+ state_deltas = _session_util .extract_state_delta (state_delta )
541+ has_app_delta = bool (state_deltas ["app" ])
542+ has_user_delta = bool (state_deltas ["user" ])
543+
534544 async with self ._with_session_lock (
535545 app_name = session .app_name ,
536546 user_id = session .user_id ,
@@ -554,7 +564,7 @@ async def append_event(self, session: Session, event: Event) -> Event:
554564 sql_session = sql_session ,
555565 state_model = schema .StorageAppState ,
556566 predicates = (schema .StorageAppState .app_name == session .app_name ,),
557- use_row_level_locking = use_row_level_locking ,
567+ use_row_level_locking = use_row_level_locking and has_app_delta ,
558568 missing_message = (
559569 "App state missing for app_name="
560570 f"{ session .app_name !r} . Session state tables should be "
@@ -568,7 +578,7 @@ async def append_event(self, session: Session, event: Event) -> Event:
568578 schema .StorageUserState .app_name == session .app_name ,
569579 schema .StorageUserState .user_id == session .user_id ,
570580 ),
571- use_row_level_locking = use_row_level_locking ,
581+ use_row_level_locking = use_row_level_locking and has_user_delta ,
572582 missing_message = (
573583 "User state missing for app_name="
574584 f"{ session .app_name !r} , user_id={ session .user_id !r} . "
@@ -599,23 +609,19 @@ async def append_event(self, session: Session, event: Event) -> Event:
599609 storage_events = [e async for e in result ]
600610 session .events = [e .to_event () for e in storage_events ]
601611
602- # Extract state delta
603- if event .actions and event .actions .state_delta :
604- state_deltas = _session_util .extract_state_delta (
605- event .actions .state_delta
612+ # Merge pre-extracted state deltas into storage.
613+ if has_app_delta :
614+ storage_app_state .state = (
615+ storage_app_state .state | state_deltas ["app" ]
616+ )
617+ if has_user_delta :
618+ storage_user_state .state = (
619+ storage_user_state .state | state_deltas ["user" ]
620+ )
621+ if state_deltas ["session" ]:
622+ storage_session .state = (
623+ storage_session .state | state_deltas ["session" ]
606624 )
607- app_state_delta = state_deltas ["app" ]
608- user_state_delta = state_deltas ["user" ]
609- session_state_delta = state_deltas ["session" ]
610- # Merge state and update storage
611- if app_state_delta :
612- storage_app_state .state = storage_app_state .state | app_state_delta
613- if user_state_delta :
614- storage_user_state .state = (
615- storage_user_state .state | user_state_delta
616- )
617- if session_state_delta :
618- storage_session .state = storage_session .state | session_state_delta
619625
620626 if is_sqlite :
621627 update_time = datetime .fromtimestamp (
0 commit comments