我目前正在开发一个使用ADO实体框架在.Net中实现DAL的项目。
数据库结构并不简单,我希望能够确保某些数据库操作是原子的。
我知道您可以通过创建STORED PROCEDURE
并使用数据库TRANSACTION
(如this SO post中所述)来实现这一目标。 (我正在使用SQL Server)
问题是,我想尽可能地保持软件方面的逻辑,我正在考虑使用.Net TransactionScope
。虽然我知道它从软件的角度来看效果很好(在提交整个范围之前没有任何内容提交给DB),但我怀疑它仍然可以确保数据库的原子执行。
有人知道吗?
更具体地说,通常代码如下所示:
using (TransactionScope scope = new TransactionScope())
{
/*
* Do some opreations such as reads, write, insert, deletes
*/
scope.Commit()
}
我想确定的是,括号内的所有内容都是“原子地”完成的(隔离= SERIALIZABLE我猜)。我的意思是,我不希望DB的状态能够在范围内的代码执行时改变。
答案 0 :(得分:2)
TransactionScope在事务中运行更新(也可能是读取,具体取决于您的事务隔离级别)
数据库提供程序已经成为此事务的一部分,因为它们在事务范围内使用 - 因此事务范围实际上是数据库事务(如果事务中涉及多个数据库/消息队列/等,则可能更多) )
编辑:实体框架详细信息
实体框架使用底层提供者的连接BeginTransaction方法。在SqlConnection的情况下,它使用SqlServer的默认值,因此将使用ReadCommitted
因此,如果您不使用事务范围,它将默认为Read Committed而不是Serializable
答案 1 :(得分:1)
“DB原子执行”是什么意思?有各种事务隔离级别。
与SQL Server交谈时,.NET TransactionScope
会使用SQL Server事务,该事务默认为Serializable
隔离级别。
答案 2 :(得分:1)
交易是始终原子,无论是在SQL中启动,在客户端中启动(例如,TransactionScope)