我在 数据库访问层 添加事物 比如:数据访问层 添加事物 添加一条数据 用到存储过程spa_sys_add_user_rule,同时添加一条修改日志 用到存储过程 spa_sys_log  .
      try
          {
            db.addUserRule(...); --添加记录
            db.addlog(...);   ---添加日志
          }
          catch (Exception ex)
          {
             tran.Rollback();  --回滚事物
             LogUtility.Add(ex); --捕获异常信息
              isSuc = false;
           }
            finally
           {
               tran = null;
            }
 在存储过程 spa_sys_add_user_rule中(要向多张表 添加记录),由于约束限制,我在此存储过程中也使用了事物 格式如下:
CREATE proc [dbo].[spa_sys_add_user_rule]
@user_id int,
@rule_id int
as
begin
if not exists (select top 1 1from tb1 where [user_id]=@user_id and rule_id=@rule_id)
begin try
begin tran
insert into  tb_1
insert into  tb_2。。
commit tran
select 1
end try
begin catch
rollback
select -1
end catch
end我想问的是 :
     要是在数据库 添加事物发生异常 捕获异常  事物回滚 并返回(select -1)
 捕获到的异常 在数据访问层 会再次捕获到吗 ? 或者说 我存储过程中 是不是不应该再使用事物?

解决方案 »

  1.   

    有了jpa可以不用数据库事务,关键还要看你编程习惯
      

  2.   

    sql 在catch里应该做处理吧在 CATCH 块的作用域内,可以使用以下系统函数来获取导致 CATCH 块执行的错误消息:ERROR_NUMBER() 返回错误号。ERROR_SEVERITY() 返回严重性。ERROR_STATE() 返回错误状态号。ERROR_PROCEDURE() 返回出现错误的存储过程或触发器的名称。ERROR_LINE() 返回导致错误的例程中的行号。ERROR_MESSAGE() 返回错误消息的完整文本。该文本可包括任何可替换参数所提供的值,如长度、对象名或时间。
      

  3.   

    http://topic.csdn.net/u/20110113/12/c6e1891e-d91f-4327-ad8f-6ba0c24f0922.html?seed=2034621121&r=71197713#r_71197713  
      

  4.   

    有没有冲突不清楚,但是容易带来很多问题那是肯定的,
    我试过asp通过ado定义事务的效率要低于数据库端的事务处理效率(比如通过存储过程)
    具体的机制没研究过,我的想法是两个里选一个 一个是给程序员用的,一个是给数据库开发人员用的