日期:2014-05-18  浏览次数:20743 次

关于数据完整性的问题 希望大神给予解答 先拜谢
先说下问题所在:  
  现在项目都是用的存储过程,但是当服务器内存占用太高,或无响应的时候会出现,执行了存储过程中的,前两句或后面的没有执行。

   
  之后想到利用 事物 来解决问题。我记得事物是要么全执行, 要么全不执行。但是同事说“ 如果SQL本身出现问题,比如机器出现问题,还是会出现问题,导致无法回滚。 还是执行了一半还是会出现问题”。

  故此特来,求解。问问大家这类的问题怎么处理,主要项目里有不少资金上面的操作,所以扣除金额,和生成记录上要有保证。

  请各位热心的朋友帮助解答问题的时候。从SQL 本身运行出现了问题。服务器出现了问题。无响应等特殊时候的情况来考虑下。来保证数据的完整性,另外使用事物会出现。那位同事说的那种问题吗?


  先谢谢大家了,在线等.
   
  


------解决方案--------------------
还是用事务吧 事务是要么执行 要么回滚的

原子性,一致性都不错


 加上 set xact_abort on 可以自动回滚 只要有错误就回滚
------解决方案--------------------
如果因为断电这些导致的故障 要避免的话 只能通过镜像切换 和数据库同步,集群这些来避免
------解决方案--------------------
探讨
请各位热心的朋友帮助解答问题的时候。从SQL 本身运行出现了问题。服务器出现了问题。无响应等特殊时候的情况来考虑下。来保证数据的完整性,另外使用事物会出现。那位同事说的那种问题吗?

------解决方案--------------------
探讨

那请问 会不会出现 向同事说的

用了事物,他走到一半如果出现,SQL本身出现了问题,他不会回滚并且,前面所执行的语句也执行了

------解决方案--------------------
事物沒提交時,重啟SQL,會回滚到沒執行事務時的狀態
------解决方案--------------------
SQL code

----原子性测试---

--表t1,id只能等于1
create table t1
(id int constraint chk_id check(id=1)
)
--表t2
create table t2
(id int 
)

--测试数据
insert into t2 values(1)
insert into t2 values(2)
insert into t2 values(3)
insert into t2 values(4)
insert into t2 values(5)

--情况1
set XACT_ABORT on
begin tran
    insert into t1 values(1)
    insert into t1 select id from t2
    insert into t1 values(1)
    
commit
--结果:表中没有插入记录
--说明:set XACT_ABORT 在语句失败时自动回滚


--情况2 transaction
begin tran

    insert into t1 select id from t2
    insert into t1 values(1)
    
commit

--结果:t1中插入一条记录
--说明:单独的begin tran,commit不具有原子性


--情况3 try catch
begin try
    begin tran
    insert into t1 values(1)
    insert into t1 select id from t2
    insert into t1 values(1)
    commit
end try
begin catch
  rollback
   print 'error'
  return
end catch

--结果:表中没有插入记录
--说明: try catch 使语句具有原子性