Don’t include more than one of these sObjects in the same transaction when performing DML operations or when using the Metadata API.
These sObjects also can't be used with the @IsTest (IsParallel=true) annotation. Split such operations into separate transactions.
- AuthSession
- ContentWorkspace
- FieldPermissions
- ForecastingShare
- Group
You can only insert and update a group in a transaction with other sObjects. Other DML operations aren’t allowed.
- GroupMember
- ObjectPermissions
- ObjectTerritory2AssignmentRule
- ObjectTerritory2AssignmentRuleItem
- PermissionSet
- PermissionSetAssignment
- QueueSObject
- RuleTerritory2Association
- SetupEntityAccess
- Territory
- Territory2
- Territory2Model
- User
You can insert a user in a transaction with other sObjects in Apex code saved using Salesforce API version 14.0 and earlier.
You can insert a user in a transaction with other sObjects in Apex code saved using Salesforce API version 15.0 and later when UserRoleId is specified as null.
You can update a user in a transaction with other sObjects in Apex code saved using Salesforce API version 14.0 and earlier
You can update a user in a transaction with other sObjects in Apex code saved using Salesforce API version 15.0 and later when the user isn’t included in a Lightning Sync or Einstein Activity Capture configuration (either active or inactive) and the following fields aren’t updated:- UserRoleId
- IsActive
- ForecastEnabled
- IsPortalEnabled
- Username
- ProfileId
- UserPackageLicense
- UserRole
- UserTerritory
- UserTerritory2Association
If you're using a Visualforce page with a custom controller, you can't mix sObject types with any of these special sObjects within a single request or action. However, you can perform DML operations on these different types of sObjects in subsequent requests. For example, you can create an account with a save button, and then create a user with a non-null role with a submit button.
- Create a method that performs a DML operation on one type of sObject.
- Create a second method that uses the future annotation to manipulate a second sObject type.
This process is demonstrated in the example in the next section.
Example: Using a Future Method to Perform Mixed DML Operations
This example shows how to perform mixed DML operations by using a future method to perform a DML operation on the User object.
public with sharing class MixedDMLFuture { public static void useFutureMethod() { // First DML operation Account a = new Account(Name='Acme'); insert as system a; // This next operation (insert a user with a role) // can't be mixed with the previous insert unless // it is within a future method. // Call future method to insert a user with a role. Util.insertUserWithRole( 'mruiz@awcomputing.com', 'mruiz', 'mruiz@awcomputing.com', 'Ruiz'); } }
public with sharing class Util { @future public static void insertUserWithRole( String uname, String al, String em, String lname) { Profile p = [SELECT Id FROM Profile WHERE Name='Standard User' WITH SYSTEM_MODE]; UserRole r = [SELECT Id FROM UserRole WHERE Name='COO' WITH SYSTEM_MODE]; // Create new user with a non-null user role ID User u = new User(alias = al, email=em, emailencodingkey='UTF-8', lastname=lname, languagelocalekey='en_US', localesidkey='en_US', profileid = p.Id, userroleid = r.Id, timezonesidkey='America/Los_Angeles', username=uname); insert as system u; } }