WEB开发网
开发学院数据库MSSQL Server 在OLTP的环境下使用大事务出现的问题 阅读

在OLTP的环境下使用大事务出现的问题

 2008-09-03 10:01:17 来源:WEB开发网   
核心提示: 对以上作分析后,产生了另外一种方案:把"公共"的绑成一个事务,在OLTP的环境下使用大事务出现的问题(3),把"私有"的绑成一个事务,原来的事务1变成2个事务,即解决了数据库因OLTP高并发访问所导致的锁阻塞问题,也尽可能的在最大程度上保证应用层数据

对以上作分析后,产生了另外一种方案:把"公共"的绑成一个事务,把"私有"的绑成一个事务,原来的事务1变成2个事务,示例如下:

  begin transaction1_1
     update thread set post_count=nvl(post_count,0) + 1 where id=#v_id;
  end transaction1_1
  
  begin transaction1_2
     insert into messgae(id,col1,col2...) values(#id,#col1,#col2...);
     update test_user set sum_reply = sum_reply + 1 where userid=#v_userid;
  end transaction1_2

此方案已经比原有完全拆分事务,在数据一致性保护上有了很大的改进,但还可以进一步改进,这个改进在程序层做,示例如下:

  begin transaction1_1
     update thread set post_count=nvl(post_count,0) + 1 where id=#v_id;
  end transaction
  
  if transaction1_1 执行成功then
  
    begin transaction1_2
        insert into messgae(id,col1,col2...) values(#id,#col1,#col2...);
        update test_user set sum_reply = sum_reply + 1 where userid=#v_userid;
     end transaction
     exception when others then
        print insert SQL into log;
        print update SQL into log;

将log信息发送报警邮件,此SQL可以手动重新执行,这种情况是比较少见的,但出现了,我们是可以进行数据订正的

  print another way 
        if you don’t want to execute insert SQL,update SQL,you can execute the SQL mannul as follows:
          update thread set post_count=nvl(post_count,0) - 1 where id=#v_id;
        end if;
        注:恢复数据一致性的方法有两种,根据实际情况恰当选择  

end if;

把大事务根据业务规则合理拆分成有一定组合的小事务,在小事务内部由数据库保证数据的一致性,并在这些小事务之间在应用层设计一定的出错控制,即解决了数据库因OLTP高并发访问所导致的锁阻塞问题,也尽可能的在最大程度上保证应用层数据的一致性。

使用星型架构或雪花架构来组织数据库内的数据。

上一页  1 2 3 

Tags:OLTP 环境 使用

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接