Getting the following error below when trying to edit a versioned feature class in an SDE database using a python script tool:
Traceback (most recent call last):
File "L:\Tools\Models\ReconcilePostCalcFields&RecreateVersions.py", line 32, in <module>
for row in cursor:
RuntimeError: workspace already in transaction mode
Code is below:
import arcpy, os # Set workspace workspace = "Database Connections\\Connection to gis-prod.sde" # Set the workspace environment arcpy.env.workspace = workspace # Create Version using SDE credentials arcpy.CreateVersion_management (workspace, "sde.default", "fieldcalcs", "PUBLIC") # Delcare variables ##versionList = arcpy.ListVersions('Database Connections\\Connection to gis-prod.sde') inFeatures = "sde_m.SDE.PARCEL" zip5expression = "!MAIL_ZIP![0:5]" fl = "fl" # Change Workspace to access data via OS Auth. workspace2 = "Database Connections\\SDE_MPL_PROD_OSAUTH.sde" arcpy.env.workspace = workspace2 # Create Feature Layer for editing arcpy.MakeFeatureLayer_management (inFeatures, fl) # Change Version arcpy.ChangeVersion_management (fl,"TRANSACTIONAL", "sde.fieldcalcs") # Start an edit session. Must provide the workspace. edit = arcpy.da.Editor(workspace2) # Edit session is started without an undo/redo stack for versioned data edit.startEditing(False, True) # Start an edit operation edit.startOperation() # Calculate the MAIL_ZIP5 field fields = ['MAIL_ZIP5'] with arcpy.da.UpdateCursor(fl, fields) as cursor: for row in cursor: row = zip5expression cursor.updateRow(row) # Stop the edit operation. edit.stopOperation() # Stop the edit session and save the changes edit.stopEditing(True)
If I comment out the UpdateCursor section, the script runs successfully. I have also tried to reconcile, post and delete the child versions before executing the script with the same failure, all locks on the database are shared locks. I thought by versioning and editing, I could get around any locking issues. Any idea how to get the workspace out of transaction mode to allow editing to the child version created in the script?
This is a known issue and defect number is #BUG-000114598. It states that "RuntimeError "workspace already in transaction mode" occurs when using da.UpdateCursor on TableView after changing the version."
Workaround steps are provided below:
1. Change the connection file to point to the desired version.
2. Use the CreateDatabaseConnection_management tool to generate a temporary connection file pointing to the desired version. Delete when the script finishes.
3. Use a config file to store the arguments for the CreateDatabaseConnection tool to keep the username and password out of the script.(optional)
This is a code snippet used in another user case with similar situation:
At the beginning of your script:
temp = r"C:\Temp"
file = "SDEConn"
arcpy.CreateArcSDEConnectionFile_management(temp, file, <Fill In The Rest With Your RBDMS Parameters>)
workspace = os.path.join(temp, file +".sde")
# Set the workspace environment
env.workspace = workspace
At the end of your script:
Hope that helps.