事务嵌套的问题

简介: 使用 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语句的嵌套。
121 1
|
1月前
|
数据库
什么是脏读例子
【10月更文挑战第15天】什么是脏读例子
|
5月前
|
Java 开发者 Spring
spring事务类型,事务传递,隔离级别?
spring事务类型,事务传递,隔离级别?
|
5月前
|
SQL 存储 数据库
事务的ACID是什么及扁平化事务、链式事务
事务的ACID是什么及扁平化事务、链式事务
|
6月前
|
C++
C++中使用嵌套的if语句
C++中使用嵌套的if语句
58 1
|
XML Java 数据格式
五、事务操作2
五、事务操作2
68 0
|
Java 数据库 Spring
清晰、明了的@Transcation事务嵌套使用
清晰、明了的@Transcation事务嵌套使用
|
Java Spring
代码如何实现事务查询
代码如何实现
131 0
|
NoSQL Redis 开发者
事务-事务的基本操作(定义,取消,执行)|学习笔记
快速学习事务-事务的基本操作(定义,取消,执行)
|
SQL 关系型数据库 MySQL
MYSQL事务嵌套,PHP事务嵌套,THINKPHP事务嵌套
MYSQL事务嵌套,PHP事务嵌套,THINKPHP事务嵌套
806 0