事务嵌套的问题

简介: 使用 TransactionScope 的过程中,如果存在嵌套事务,比如, Bll 层使用了事务,而所调用的 Dal 内方法也使用了事务的话。假设我们吃掉了 Dal 的异常,那么,外部事务会不会成功? 测试代码如下: using(var ts = new TransactionScope()...

使用 TransactionScope 的过程中,如果存在嵌套事务,比如, Bll 层使用了事务,而所调用的 Dal 内方法也使用了事务的话。假设我们吃掉了 Dal 的异常,那么,外部事务会不会成功?

测试代码如下:

using(var ts = new TransactionScope())
{
    foreach(var conn in conns)
    {
        conn.Dump();   
        ExecuteNonQuery(conn, CommandType.Text, "update [EL_Organization].[User] set Name='hhhhhh' where UserName='luminji'",null);
        try
        {
            using(TransactionScope tsInner = new TransactionScope())
            {
                ExecuteNonQuery(conn1, CommandType.Text, "update [EL_Organization].[User] set Name='lll' where UserName='luminji1'",null);
                throw new Exception();
                ExecuteNonQuery(conn2, CommandType.Text, "update [EL_Organization].[User] set Name='lll' where UserName='luminji1'",null);
                tsInner.Complete();
            }
        }
        catch
        {
        }
    }
   
    ts.Complete();
}

测试发现,TransactionScope 所代表的事务,是会往上抛的,即,内部事务失败,外部也同样失败。

所以,轻易不要吃掉 Dal 层的异常,否则,业务逻辑层的代码执行失败(sql 执行失败),上层没有得到异常,却又不知道为什么发生了异常了。

Creative Commons License本文基于 Creative Commons Attribution 2.5 China Mainland License发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名 http://www.cnblogs.com/luminji(包含链接)。如您有任何疑问或者授权方面的协商,请给我留言。
目录
相关文章
if语句的嵌套
if语句的嵌套。
119 1
|
5月前
|
SQL 存储 数据库
事务的ACID是什么及扁平化事务、链式事务
事务的ACID是什么及扁平化事务、链式事务
|
5月前
|
Java 开发者 Spring
spring事务类型,事务传递,隔离级别?
spring事务类型,事务传递,隔离级别?
|
6月前
|
C++
C++中使用嵌套的if语句
C++中使用嵌套的if语句
48 1
|
Java Spring
代码如何实现事务查询
代码如何实现
128 0
|
NoSQL Redis 开发者
事务-事务的基本操作(定义,取消,执行)|学习笔记
快速学习事务-事务的基本操作(定义,取消,执行)
|
存储 SQL 缓存
mysql存储过程与事务
mysql存储过程与事务
709 0
mysql存储过程与事务
|
SQL 关系型数据库 MySQL
MYSQL事务嵌套,PHP事务嵌套,THINKPHP事务嵌套
MYSQL事务嵌套,PHP事务嵌套,THINKPHP事务嵌套
800 0
|
应用服务中间件 Java 缓存
关键字:查询,事务,粒度
[size=medium]/** *作者:张荣华 *日期:2008-08-22 **/ 在那遥远的过去,俺曾经写过一篇关于事务的文章,原文地址见: http://ahuaxuan.iteye.com/blog/95124.文章大意是这样的:在spring+hibernate的场景下,r
1658 0