关于数据完整性的问题 希望大神给予解答 先拜谢
先说下问题所在:
现在项目都是用的存储过程,但是当服务器内存占用太高,或无响应的时候会出现,执行了存储过程中的,前两句或后面的没有执行。
之后想到利用 事物 来解决问题。我记得事物是要么全执行, 要么全不执行。但是同事说“ 如果SQL本身出现问题,比如机器出现问题,还是会出现问题,导致无法回滚。 还是执行了一半还是会出现问题”。
故此特来,求解。问问大家这类的问题怎么处理,主要项目里有不少资金上面的操作,所以扣除金额,和生成记录上要有保证。
请各位热心的朋友帮助解答问题的时候。从SQL 本身运行出现了问题。服务器出现了问题。无响应等特殊时候的情况来考虑下。来保证数据的完整性,另外使用事物会出现。那位同事说的那种问题吗?
先谢谢大家了,在线等.
[解决办法]
还是用事务吧 事务是要么执行 要么回滚的
原子性,一致性都不错
加上 set xact_abort on 可以自动回滚 只要有错误就回滚
[解决办法]
如果因为断电这些导致的故障 要避免的话 只能通过镜像切换 和数据库同步,集群这些来避免
[解决办法]
----原子性测试-----表t1,id只能等于1create table t1(id int constraint chk_id check(id=1))--表t2create 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)--情况1set XACT_ABORT onbegin tran insert into t1 values(1) insert into t1 select id from t2 insert into t1 values(1) commit--结果:表中没有插入记录--说明:set XACT_ABORT 在语句失败时自动回滚--情况2 transactionbegin tran insert into t1 select id from t2 insert into t1 values(1) commit--结果:t1中插入一条记录--说明:单独的begin tran,commit不具有原子性--情况3 try catchbegin try begin tran insert into t1 values(1) insert into t1 select id from t2 insert into t1 values(1) commitend trybegin catch rollback print 'error' returnend catch--结果:表中没有插入记录--说明: try catch 使语句具有原子性