如何避免不同应用更改数据,导致的数据不一致。
2015-08-02 11:42
405 查看
最近的项目中遇到两个前端同时去更新一个数据库的表导致数据不完整。
分析原因是一个更新使用了事务,另一个更新没有使用事务。做了一个测试代码如下:
1.
--create tableabc(id int);
--go
--insertabc(id) values(1);
--set lock_timeout 180
begin tran
select *from
abc --with(holdlock);
waitfor
delay '00:00:10';
update abcset
id=(selectid
+5 from
abc )
commit tran;
select *from
abc;
2. updateabc
set id=8;
先从1开始执行,然后执行2..得到的结果是13.说明,虽然1先执行,但由于阻塞,2先通过了。因此结果是13.这不是我们希望的结果。去掉注释后,得到正确的结果8..
我们将2使用事务处理。改成3,同进注释掉1中的with(holdlock),再执行
3. begin
tran
update abcset
id=8;
commit tran;
得到的结果是13.说明1由于阻塞,2先通过。说明两个不同的事务,也可能出现第二个事务先被更新的情况。因此解决这个问题最理想的方式是人为加锁。使用 holdlock.但默认为这个锁会一直等,直到获取共享锁。我们不希望它一直这样等下去。因此在储存过程的开头加上 lock_timeout .这个参数是以毫秒为单位的。
另,如果事务处理过长,不愿意另外进程等待的时间 过多,可以用下来的语句来做一个锁定,在需要处理的数据之前。
if exists(select * from abc b with (holdlock) left join orders r on r.收购合同号=b.id )
分析原因是一个更新使用了事务,另一个更新没有使用事务。做了一个测试代码如下:
1.
--create tableabc(id int);
--go
--insertabc(id) values(1);
--set lock_timeout 180
begin tran
select *from
abc --with(holdlock);
waitfor
delay '00:00:10';
update abcset
id=(selectid
+5 from
abc )
commit tran;
select *from
abc;
2. updateabc
set id=8;
先从1开始执行,然后执行2..得到的结果是13.说明,虽然1先执行,但由于阻塞,2先通过了。因此结果是13.这不是我们希望的结果。去掉注释后,得到正确的结果8..
我们将2使用事务处理。改成3,同进注释掉1中的with(holdlock),再执行
3. begin
tran
update abcset
id=8;
commit tran;
得到的结果是13.说明1由于阻塞,2先通过。说明两个不同的事务,也可能出现第二个事务先被更新的情况。因此解决这个问题最理想的方式是人为加锁。使用 holdlock.但默认为这个锁会一直等,直到获取共享锁。我们不希望它一直这样等下去。因此在储存过程的开头加上 lock_timeout .这个参数是以毫秒为单位的。
另,如果事务处理过长,不愿意另外进程等待的时间 过多,可以用下来的语句来做一个锁定,在需要处理的数据之前。
if exists(select * from abc b with (holdlock) left join orders r on r.收购合同号=b.id )
相关文章推荐
- VC6\VS2003 转换到VS2005 时可能会遇到的问题以及解决方法
- 晚期(运行期)优化
- Java之集合类【ArrayList】【入门版,实例解析】
- 程序员年少成名,是一种什么样的体验
- LeetCode之Search for a Range
- 第七课第五节,流程语句(版本5.0)
- MySQL日志表按月分区
- ubuntu生成快捷方式的简便方法
- hdu 5329 Question for the Leader 枚举,划分图为k个联通的子图
- mysql安装图解 mysql图文安装教程(详细说明)
- Java构造方法
- PHP读取 sql 文件并写入数据库
- springmvc 的数据回显
- 【POJ3260】【The Fewest Coins】
- 使用AccessibilityService实现微信自动抢红包
- C语言:十进制进制转换为其他进制(思想:查表法)
- 腾讯最赚钱的部门是怎么做运维的?
- Gym 100570E : Palindrome Query
- git 工具常用命令汇总
- Git本地基础操作