views:

437

answers:

4

I would love to know how to perform a series of operations in a SharePoint context within a transaction. For example, I would like to be able to do something like the following:

context.BeginTransaction();
listItemA.Update();
listItemB.Update();
context.CommitTransaction();

I know this isn't possible with the OOTB APIs, but someone has got to have figured out how to accomplish this. Is it possible to get a reference to the database connection in order to handle the transaction? Or any other ideas?

+4  A: 

Although SharePoint technically uses SQL as a storage backing, we're not supposed to treat it like a database-based application. SP creates a faux-filesystem of sorts, which is what we interact with via the API. So from the developer perspective, Sharepoint is pretty much transaction-less.

Unfortunately that's pretty much all there is to it :) Even thinking about trying to get involved with the database directly will result in Old Testament pain. Rending of garments, wailing and gnashing of teeth ;)

Rex M
Go SharePoint. Many years of relational theory and finely tuned implementations are trivialized.
pst
+3  A: 

If you use versioning you could try a solution that checks out your item, performs updates and checks in. If rollback is needed, just undo the checkout.

Could work maybe??

Johan Leino
+2  A: 

Another option is to use workflow, mentioned here. As stated in How Windows SharePoint Services Processes Workflow Activities:

Windows SharePoint Services runs the workflow until it reaches a point where it cannot proceed because it is waiting for some event to occur: for example, a user must designate a task as completed. Only at this "commit point" does Windows SharePoint Services commit the changes made in the previous Windows SharePoint Services-specific workflow activities. Those changes are batched into a single SQL transaction.

Alex Angas
This is kind of misleading. It refers to the serialization (dehydration) aspects of a Workflows. The same can be said that invoking "Update" on an SPListItem is a "commit point". However, it is a singular operation that supports no transactions.
pst
+2  A: 

Simply use Recycle(). Keep track of the GUID in a GUID[]. If one fails open de RecycleBin and restore/delete all by GUID

GUID[] guids = new GUID[]; SPWeb web; SPListItem item; SPList list;

try { foreach item in list

GUID current = item.Recycle() guids.add(current);

item.Delete(); } catch{ if one fails : web.RecycleBin.Restore(guids); }

if all succeed : web.RecycleBin.Delete(guids):

Rutger Hemrika