前辈们给解释下C#.NET下的数据库连接的Transaction机制。

特兰 2010-04-21 04:26:28
本来写delphi,现在转c#.net,觉得还是delphi简单,其中transaction是和数据库连接绑定的,
TDatabase.StartTransaction.

而c#下需要建立一个transaction对象,然后传给command对象的transaction属性,
不知道这个transaction是和哪个对象绑定的。

是不是一个transaction对象对应一个事务,其间可以经历多个command对象,
是不是一个connection可以同时对应多个transaction对象。

脑袋有点乱,问题描述也有点乱,看懂的给解释下,看不懂的请直接给讲解下个人对transaction的理解


非常感激!!!!!!
...全文
105 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
卧_槽 2010-04-23
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 yuwenge 的回复:]

引用 7 楼 lxz3000 的回复:

引用 6 楼 zsuswy 的回复:

是不是一个transaction对象对应一个事务,其间可以经历多个command对象,
--------
Yes

是不是一个connection可以同时对应多个transaction对象。
---------
Yes


几个事务可以同时并行执行吗?


-----------
……
[/Quote]
直接说No可能太粗暴了。具体事务的执行方式,不同的数据库有不同的解释。但是基本上事物的执行时独占一个connection的。但是具体数据库多个connection的处理方式就看数据库本身的机制了。
卧_槽 2010-04-23
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 lxz3000 的回复:]

引用 6 楼 zsuswy 的回复:

是不是一个transaction对象对应一个事务,其间可以经历多个command对象,
--------
Yes

是不是一个connection可以同时对应多个transaction对象。
---------
Yes


几个事务可以同时并行执行吗?
[/Quote]

-----------
No
特兰 2010-04-23
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 zsuswy 的回复:]

是不是一个transaction对象对应一个事务,其间可以经历多个command对象,
--------
Yes

是不是一个connection可以同时对应多个transaction对象。
---------
Yes
[/Quote]

几个事务可以同时并行执行吗?

zsuswy 2010-04-21
  • 打赏
  • 举报
回复
是不是一个transaction对象对应一个事务,其间可以经历多个command对象,
--------
Yes

是不是一个connection可以同时对应多个transaction对象。
---------
Yes
liuyileneal 2010-04-21
  • 打赏
  • 举报
回复
一个conn可以对应多个事务,但是要等到其中一个事务提交或者回滚之后另一个事务才可以开始
实例代码

SqlTransaction ts1 = conn.BeginTransaction();


//ts1
SqlCommand cmd = new SqlCommand("ResgionInsert", conn);
cmd.Transaction = ts1;
cmd.CommandType = CommandType.StoredProcedure;
SqlParameter id = new SqlParameter("@ID", SqlDbType.Int, 0, ParameterDirection.Output, false, 0, 0, "id", DataRowVersion.Default, null);
SqlParameter name = new SqlParameter("@name", SqlDbType.NVarChar);
name.Value = "Neal Liu";
SqlParameter age = new SqlParameter("@age", SqlDbType.Int);
age.Value = 21;
cmd.Parameters.Add(id);
cmd.Parameters.Add(name);
cmd.Parameters.Add(age);
cmd.UpdatedRowSource = UpdateRowSource.OutputParameters;
int newId = -1;

SqlCommand cmd1 = new SqlCommand("select * from stu", conn);
cmd1.Transaction = ts1;

try
{
cmd.ExecuteNonQuery();
newId = (int)cmd.Parameters["@ID"].Value;
SqlDataReader dr = cmd1.ExecuteReader();
dt.Load(dr);
ts1.Commit();
}
catch
{
ts1.Rollback();
}
SqlTransaction ts2 = conn.BeginTransaction();
SqlCommand cmd2 = new SqlCommand("select * from stu", conn);
cmd2.Transaction = ts2;
try
{
SqlDataReader dr2 = cmd2.ExecuteReader();
dt.Load(dr2);
ts2.Commit();

}
catch
{
ts2.Rollback();
}


}

llddyy123wq 2010-04-21
  • 打赏
  • 举报
回复
楼主不是的。C#的方式比dephi多些。你说的那种方式是其中之一。
还有一种试试和dephi一样的。也可以直接和数据库连接对象一起用的。
C#的sqlconnection对象也有一个方法BeginTranstration()
ttllxx 2010-04-21
  • 打赏
  • 举报
回复
c#跟delphi还是很像的。一个数据库一个连接,一个连接可以有多个command等其它对象。在操作数据库,好像没什么大的区别
liuyileneal 2010-04-21
  • 打赏
  • 举报
回复
事务是连接的一部分
因为他是又Conn创建的
一个transaction对象对应一个事务,其间可以经历多个command对象
lpingz 2010-04-21
  • 打赏
  • 举报
回复
[Quote=引用楼主 lxz3000 的回复:]
是不是一个transaction对象对应一个事务,其间可以经历多个command对象,
是不是一个connection可以同时对应多个 transaction对象。
[/Quote]
这两个问题的答案都是 : 是!

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧