<!-- 
RSS generated by JIRA (1001.0.0-SNAPSHOT#100246-sha1:7a5c50119eb0633d306e14180817ddef5e80c75d) at Fri Feb 09 00:26:55 UTC 2024

It is possible to restrict the fields that are returned in this document by specifying the 'field' parameter in your request.
For example, to request only the issue key and summary add field=key&field=summary to the URL of your request.
-->
<rss version="0.92" >
<channel>
    <title>FOLIO Jira</title>
    <link>https://folio-org.atlassian.net</link>
    <description>This file is an XML representation of an issue</description>
    <language>en-us</language>    <build-info>
        <version>1001.0.0-SNAPSHOT</version>
        <build-number>100246</build-number>
        <build-date>07-02-2024</build-date>
    </build-info>

<item>
            <title>[UXPROD-2796] Prevent update conflicts when doing manual edits (User A and User B)</title>
                <link>https://folio-org.atlassian.net/browse/UXPROD-2796</link>
                <project id="10000" key="UXPROD">UX Product</project>
                    <description>&lt;p&gt;&lt;b&gt;Problem statement&lt;/b&gt;&lt;br/&gt;
In FOLIO, most storage modules follow the &quot;last writer wins&quot; strategy for handling record updates. From the UI perspective this may lead to a situation when a stale record (older version of a give record) previously loaded into the UI may override a more recent version on the server. Hence relevant updates may get lost in the process and the user is not made aware of what has happened.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Proposed solution&lt;/b&gt;&lt;br/&gt;
From the storage and API perspective, optimistic locking is the proposed strategy to handle conflicts (
    &lt;span class=&quot;jira-issue-macro resolved&quot; data-jira-key=&quot;UXPROD-1752&quot; &gt;
                &lt;a href=&quot;https://folio-org.atlassian.net/browse/UXPROD-1752&quot; class=&quot;jira-issue-macro-key issue-link&quot;  title=&quot;Prevent update conflicts (via optimistic locking): platform support for detection&quot; &gt;
            &lt;img class=&quot;icon&quot; src=&quot;https://folio-org.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10322?size=medium&quot; /&gt;
            UXPROD-1752
        &lt;/a&gt;
                                                    &lt;span class=&quot;aui-lozenge aui-lozenge-subtle aui-lozenge-success jira-macro-single-issue-export-pdf&quot;&gt;Closed&lt;/span&gt;
            &lt;/span&gt;
). Handling of updates in FOLIO should rely on more explicit semantics, both in the storage (backend) APIs and the way it is communicated to the user through the UI.  &lt;/p&gt;

&lt;p&gt;&lt;b&gt;Use cases&lt;/b&gt; &lt;br/&gt;
&lt;b&gt;2 users editing the same record at the same time&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;User A and User B editing the same record at the same time (not frequent) &#8211; users, orders, instances, holdings, items, requests&lt;/li&gt;
	&lt;li&gt;User A editing an item and User B creating a request for that item&lt;/li&gt;
	&lt;li&gt;User A editing and item and User B putting that item on course reserve at the same time&lt;/li&gt;
	&lt;li&gt;User A editing an invoice and User B trying to approve the same invoice at the same time&lt;/li&gt;
	&lt;li&gt;User A editing an item and User B deleting the item before User A&apos;s edits are saved (see  
    &lt;span class=&quot;jira-issue-macro&quot; data-jira-key=&quot;UIIN-730&quot; &gt;
                &lt;a href=&quot;https://folio-org.atlassian.net/browse/UIIN-730&quot; class=&quot;jira-issue-macro-key issue-link&quot;  title=&quot;Error message when item has been deleted from another window&quot; &gt;
            &lt;img class=&quot;icon&quot; src=&quot;https://folio-org.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10300?size=medium&quot; /&gt;
            UIIN-730
        &lt;/a&gt;
                                                    &lt;span class=&quot;aui-lozenge aui-lozenge-subtle aui-lozenge-complete jira-macro-single-issue-export-pdf&quot;&gt;Blocked&lt;/span&gt;
            &lt;/span&gt;
)&lt;/li&gt;
	&lt;li&gt;User A editing a request and User B cancelling the request before User A&apos;s edits are saved (see 
    &lt;span class=&quot;jira-issue-macro resolved&quot; data-jira-key=&quot;UIREQ-344&quot; &gt;
                &lt;a href=&quot;https://folio-org.atlassian.net/browse/UIREQ-344&quot; class=&quot;jira-issue-macro-key issue-link&quot;  title=&quot;Deleting already-deleted request causes ungraceful error&quot; &gt;
            &lt;img class=&quot;icon&quot; src=&quot;https://folio-org.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10300?size=medium&quot; /&gt;
            UIREQ-344
        &lt;/a&gt;
                                                    &lt;span class=&quot;aui-lozenge aui-lozenge-subtle aui-lozenge-success jira-macro-single-issue-export-pdf&quot;&gt;Closed&lt;/span&gt;
            &lt;/span&gt;
)&lt;/li&gt;
	&lt;li&gt;When attempting to update holdings and their items concurrently the holdings updates will ever so often interfere with the item updates, effectively nullifying the latter (see 
    &lt;span class=&quot;jira-issue-macro resolved&quot; data-jira-key=&quot;MODINVSTOR-516&quot; &gt;
                &lt;a href=&quot;https://folio-org.atlassian.net/browse/MODINVSTOR-516&quot; class=&quot;jira-issue-macro-key issue-link&quot;  title=&quot;Cannot safely update holdings and items concurrently for any given instance&quot; &gt;
            &lt;img class=&quot;icon&quot; src=&quot;https://folio-org.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10303?size=medium&quot; /&gt;
            MODINVSTOR-516
        &lt;/a&gt;
                                                    &lt;span class=&quot;aui-lozenge aui-lozenge-subtle aui-lozenge-success jira-macro-single-issue-export-pdf&quot;&gt;Closed&lt;/span&gt;
            &lt;/span&gt;
). This particular item is being addressed via 
    &lt;span class=&quot;jira-issue-macro resolved&quot; data-jira-key=&quot;RMB-388&quot; &gt;
                &lt;a href=&quot;https://folio-org.atlassian.net/browse/RMB-388&quot; class=&quot;jira-issue-macro-key issue-link&quot;  title=&quot;PostgresClient.getById with transaction, with &amp;quot;SELECT &#8230; FOR UPDATE&amp;quot;&quot; &gt;
            &lt;img class=&quot;icon&quot; src=&quot;https://folio-org.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10322?size=medium&quot; /&gt;
            RMB-388
        &lt;/a&gt;
                                                    &lt;span class=&quot;aui-lozenge aui-lozenge-subtle aui-lozenge-success jira-macro-single-issue-export-pdf&quot;&gt;Closed&lt;/span&gt;
            &lt;/span&gt;
.&lt;/li&gt;
&lt;/ul&gt;
</description>
                <environment></environment>
        <key id="11581">UXPROD-2796</key>
            <summary>Prevent update conflicts when doing manual edits (User A and User B)</summary>
                <type id="10002" iconUrl="https://folio-org.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10322?size=medium">New Feature</type>
                            <parent id="11697">UXPROD-1814</parent>
                                    <priority id="10002" iconUrl="https://dev.folio.org/assets/jira-priority/jira-p3.svg">P3</priority>
                        <status id="6" iconUrl="https://folio-org.atlassian.net/images/icons/statuses/closed.png" description="The issue is considered finished, the resolution is correct. Issues which are closed can be reopened.">Closed</status>
                    <statusCategory id="3" key="done" colorName="green"/>
                                    <resolution id="10001">Duplicate</resolution>
                                                        <assignee accountid="557058:b8e64633-1f7c-402d-9caf-9959a5ba5d0d">Jakub Skoczen</assignee>
                                                                <reporter accountid="557058:f80403de-e149-421e-8750-af45c853402f">Charlotte Whitt</reporter>
                                    <labels>
                            <label>Support</label>
                            <label>platform-backlog</label>
                            <label>round_iv</label>
                    </labels>
                <created>Mon, 2 Nov 2020 08:29:37 +0000</created>
                <updated>Wed, 27 Apr 2022 09:29:47 +0000</updated>
                            <resolved>Mon, 14 Jun 2021 20:27:12 +0000</resolved>
                                                                        <due></due>
                            <votes>0</votes>
                                    <watches>17</watches>
                                                                <comments>
                                                            <comment id="17665" author="62a96ae7192edb006f9f1bf9" created="Mon, 14 Jun 2021 20:27:12 +0000"  >&lt;p&gt;After talking with &lt;a href=&quot;https://folio-org.atlassian.net/secure/ViewProfile.jspa?accountId=557058%3Ab8e64633-1f7c-402d-9caf-9959a5ba5d0d&quot; class=&quot;user-hover&quot; rel=&quot;557058:b8e64633-1f7c-402d-9caf-9959a5ba5d0d&quot; data-account-id=&quot;557058:b8e64633-1f7c-402d-9caf-9959a5ba5d0d&quot; accountid=&quot;557058:b8e64633-1f7c-402d-9caf-9959a5ba5d0d&quot; rel=&quot;noreferrer&quot;&gt;Jakub Skoczen&lt;/a&gt;, I have decided to close this feature. 
    &lt;span class=&quot;jira-issue-macro resolved&quot; data-jira-key=&quot;UXPROD-1752&quot; &gt;
                &lt;a href=&quot;https://folio-org.atlassian.net/browse/UXPROD-1752&quot; class=&quot;jira-issue-macro-key issue-link&quot;  title=&quot;Prevent update conflicts (via optimistic locking): platform support for detection&quot; &gt;
            &lt;img class=&quot;icon&quot; src=&quot;https://folio-org.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10322?size=medium&quot; /&gt;
            UXPROD-1752
        &lt;/a&gt;
                                                    &lt;span class=&quot;aui-lozenge aui-lozenge-subtle aui-lozenge-success jira-macro-single-issue-export-pdf&quot;&gt;Closed&lt;/span&gt;
            &lt;/span&gt;
 will/have addressed the work to prevent conflicts. Each app/dev team will create a feature(s) to implement the work noted with 
    &lt;span class=&quot;jira-issue-macro resolved&quot; data-jira-key=&quot;UXPROD-1752&quot; &gt;
                &lt;a href=&quot;https://folio-org.atlassian.net/browse/UXPROD-1752&quot; class=&quot;jira-issue-macro-key issue-link&quot;  title=&quot;Prevent update conflicts (via optimistic locking): platform support for detection&quot; &gt;
            &lt;img class=&quot;icon&quot; src=&quot;https://folio-org.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10322?size=medium&quot; /&gt;
            UXPROD-1752
        &lt;/a&gt;
                                                    &lt;span class=&quot;aui-lozenge aui-lozenge-subtle aui-lozenge-success jira-macro-single-issue-export-pdf&quot;&gt;Closed&lt;/span&gt;
            &lt;/span&gt;
 &lt;/p&gt;

&lt;p&gt;
    &lt;span class=&quot;jira-issue-macro&quot; data-jira-key=&quot;UXPROD-2994&quot; &gt;
                &lt;a href=&quot;https://folio-org.atlassian.net/browse/UXPROD-2994&quot; class=&quot;jira-issue-macro-key issue-link&quot;  title=&quot;Optimistic Locking: coordinate rollout of &amp;quot;failOnConflict&amp;quot; to selected modules and APIs&quot; &gt;
            &lt;img class=&quot;icon&quot; src=&quot;https://folio-org.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10322?size=medium&quot; /&gt;
            UXPROD-2994
        &lt;/a&gt;
                                                    &lt;span class=&quot;aui-lozenge aui-lozenge-subtle aui-lozenge-complete jira-macro-single-issue-export-pdf&quot;&gt;Open&lt;/span&gt;
            &lt;/span&gt;
 outlines the work to implement optimistic locking (OL) for the Inventory app. It is the first app to implement OL and will serve as the pattern for dev teams to apply OL to their apps/systems.  &lt;/p&gt;</comment>
                    </comments>
                <issuelinks>
                            <issuelinktype id="10000">
                    <name>Blocks</name>
                                                                <inwardlinks description="is blocked by">
                                        <issuelink>
            <issuekey id="57414">RMB-719</issuekey>
        </issuelink>
            <issuelink>
            <issuekey id="11061">UXPROD-1752</issuekey>
        </issuelink>
                            </inwardlinks>
                                    </issuelinktype>
                            <issuelinktype id="10008">
                    <name>Defines</name>
                                            <outwardlinks description="defines">
                                        <issuelink>
            <issuekey id="13637">UXPROD-3058</issuekey>
        </issuelink>
                            </outwardlinks>
                                                                <inwardlinks description="is defined by ">
                                        <issuelink>
            <issuekey id="56272">MODINVSTOR-713</issuekey>
        </issuelink>
            <issuelink>
            <issuekey id="57414">RMB-719</issuekey>
        </issuelink>
            <issuelink>
            <issuekey id="57419">RMB-727</issuekey>
        </issuelink>
            <issuelink>
            <issuekey id="48542">UIIN-1245</issuekey>
        </issuelink>
                            </inwardlinks>
                                    </issuelinktype>
                            <issuelinktype id="10003">
                    <name>Relates</name>
                                            <outwardlinks description="relates to">
                                        <issuelink>
            <issuekey id="56686">RMB-688</issuekey>
        </issuelink>
            <issuelink>
            <issuekey id="38351">DEBT-1</issuekey>
        </issuelink>
            <issuelink>
            <issuekey id="57058">RMB-388</issuekey>
        </issuelink>
            <issuelink>
            <issuekey id="25916">UIREQ-344</issuekey>
        </issuelink>
            <issuelink>
            <issuekey id="46668">UIIN-730</issuekey>
        </issuelink>
                            </outwardlinks>
                                                                <inwardlinks description="relates to">
                                        <issuelink>
            <issuekey id="79654">FOLIO-2027</issuekey>
        </issuelink>
            <issuelink>
            <issuekey id="56101">MODINVSTOR-516</issuekey>
        </issuelink>
            <issuelink>
            <issuekey id="12057">UXPROD-3089</issuekey>
        </issuelink>
            <issuelink>
            <issuekey id="11584">UXPROD-2798</issuekey>
        </issuelink>
                            </inwardlinks>
                                    </issuelinktype>
                    </issuelinks>
                <attachments>
                    </attachments>
                <subtasks>
                    </subtasks>
                <customfields>
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    <customfield id="customfield_10000" key="com.atlassian.jira.plugins.jira-development-integration-plugin:devsummarycf">
                        <customfieldname>Development</customfieldname>
                        <customfieldvalues>
                            
                        </customfieldvalues>
                    </customfield>
                                                                <customfield id="customfield_10057" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                        <customfieldname>Development Team</customfieldname>
                        <customfieldvalues>
                                <customfieldvalue key="10144"><![CDATA[Core: Platform]]></customfieldvalue>

                        </customfieldvalues>
                    </customfield>
                                                                <customfield id="customfield_10014" key="com.pyxis.greenhopper.jira:gh-epic-link">
                        <customfieldname>Epic Link</customfieldname>
                        <customfieldvalues>
                            <customfieldvalue key="$xmlutils.escape($text)">Platform, DevOps and Release Management</customfieldvalue>
                        </customfieldvalues>
                    </customfield>
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            <customfield id="customfield_10019" key="com.pyxis.greenhopper.jira:gh-lexo-rank">
                        <customfieldname>Rank</customfieldname>
                        <customfieldvalues>
                            <customfieldvalue>0|i01xcf:</customfieldvalue>

                        </customfieldvalues>
                    </customfield>
                                                                                            <customfield id="customfield_10071" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                        <customfieldname>Rank: 5Colleges (Full Jul 2021)</customfieldname>
                        <customfieldvalues>
                                <customfieldvalue key="10223"><![CDATA[R1]]></customfieldvalue>

                        </customfieldvalues>
                    </customfield>
                                                                                                                        <customfield id="customfield_10068" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                        <customfieldname>Rank: Chicago (MVP Sum 2020)</customfieldname>
                        <customfieldvalues>
                                <customfieldvalue key="10208"><![CDATA[R1]]></customfieldvalue>

                        </customfieldvalues>
                    </customfield>
                                                                <customfield id="customfield_10069" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                        <customfieldname>Rank: Cornell (Full Sum 2021)</customfieldname>
                        <customfieldvalues>
                                <customfieldvalue key="10213"><![CDATA[R1]]></customfieldvalue>

                        </customfieldvalues>
                    </customfield>
                                                                <customfield id="customfield_10070" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                        <customfieldname>Rank: Duke (Full Sum 2021)</customfieldname>
                        <customfieldvalues>
                                <customfieldvalue key="10218"><![CDATA[R1]]></customfieldvalue>

                        </customfieldvalues>
                    </customfield>
                                                                <customfield id="customfield_10073" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                        <customfieldname>Rank: FLO (MVP Sum 2020)</customfieldname>
                        <customfieldvalues>
                                <customfieldvalue key="10234"><![CDATA[R2]]></customfieldvalue>

                        </customfieldvalues>
                    </customfield>
                                                                <customfield id="customfield_10074" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                        <customfieldname>Rank: GBV (MVP Sum 2020)</customfieldname>
                        <customfieldvalues>
                                <customfieldvalue key="10238"><![CDATA[R1]]></customfieldvalue>

                        </customfieldvalues>
                    </customfield>
                                                                                                                                                                                                                                        <customfield id="customfield_10079" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                        <customfieldname>Rank: Leipzig (Full TBD)</customfieldname>
                        <customfieldvalues>
                                <customfieldvalue key="10263"><![CDATA[R1]]></customfieldvalue>

                        </customfieldvalues>
                    </customfield>
                                                                                                                        <customfield id="customfield_10085" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                        <customfieldname>Rank: MO State (MVP June 2020)</customfieldname>
                        <customfieldvalues>
                                <customfieldvalue key="10294"><![CDATA[R1]]></customfieldvalue>

                        </customfieldvalues>
                    </customfield>
                                                                                                                                                                                                                                        <customfield id="customfield_10089" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                        <customfieldname>Rank: TAMU (MVP Jan 2021)</customfieldname>
                        <customfieldvalues>
                                <customfieldvalue key="10314"><![CDATA[R1]]></customfieldvalue>

                        </customfieldvalues>
                    </customfield>
                                                                                            <customfield id="customfield_10091" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                        <customfieldname>Rank: U of AL (MVP Oct 2020)</customfieldname>
                        <customfieldvalues>
                                <customfieldvalue key="10324"><![CDATA[R1]]></customfieldvalue>

                        </customfieldvalues>
                    </customfield>
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                <customfield id="customfield_10020" key="com.pyxis.greenhopper.jira:gh-sprint">
                        <customfieldname>Sprint</customfieldname>
                        <customfieldvalues>
                            
                        </customfieldvalues>
                    </customfield>
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        <customfield id="customfield_10024" key="com.atlassian.jira.ext.charting:firstresponsedate">
                        <customfieldname>[CHART] Date of First Response</customfieldname>
                        <customfieldvalues>
                            <customfieldvalue>Mon, 14 Jun 2021 20:27:12 +0000</customfieldvalue>

                        </customfieldvalues>
                    </customfield>
                                                                <customfield id="customfield_10025" key="com.atlassian.jira.ext.charting:timeinstatus">
                        <customfieldname>[CHART] Time in Status</customfieldname>
                        <customfieldvalues>
                            
                        </customfieldvalues>
                    </customfield>
                                    </customfields>
    </item>
</channel>
</rss>