该帖已经被评为隐藏帖
|
|
---|---|
作者 | 正文 |
发表时间:2009-08-09
用最高级别的序列化读?
脏读,不可重复读,幻读?到底是哪个问题呢? |
|
返回顶楼 | |
发表时间:2009-08-09
jxsgy 写道 attr1和attr2做成主键,这样让数据库帮你检查。
|
|
返回顶楼 | |
发表时间:2009-08-09
N多人提版本,也不看人家说的是并发插入问题,版本只解决更新问题
做成复合主键比较实在简单 |
|
返回顶楼 | |
发表时间:2009-08-10
PK是干嘛的?
|
|
返回顶楼 | |
发表时间:2009-08-10
利用数据库的锁机制解决,不同的数据库有所不同。
|
|
返回顶楼 | |
发表时间:2009-08-10
dmewy 写道 PK是干嘛的?
唯一性约束比较好吧,不一定用pk,能不用联合主键尽量不用吧,特别是大表 |
|
返回顶楼 | |
发表时间:2009-08-10
dmewy 写道 PK是干嘛的?
如果pk是DB自动生成的...估计也不行吧? |
|
返回顶楼 | |
发表时间:2009-08-10
如果不想锁表,且又必须保证两边的提交都不会出错,那么可以采用以下异步的方式来实现;
假设有对象 A{ att1, att2 } 那么,针对这个对象建立两个表,一个是主数据表,保存状态,另外一个是脏数据表,用于提交状态修改的内容,两个表列基本一致,脏数据表多一个时间戳字段。所有的提交都insert到脏数据表,这样子不用锁表,但是又保证了每次提交都快速得到响应,然后在之后的任意一次读取属性的时候都尝试合并脏数据。 假设T1,T2,T3都在同时提交, T1提交{'aa','bb'},T2提交{'11','22'},T3提交{'12','fr'}虽然说是同时提交,但是总有先后顺序,假设数据库中脏表此时如下 T1{'aa','bb'}2009-8-10 10:04:33 123 T3{'12','fr'}2009-8-10 10:04:33 125 T2{'11','22'}2009-8-10 10:04:33 127 每次入库都相差2ms,然后T2开始读取属性了,那么此时就开始尝试合并,其实合并很简单,就是取最后提交的那一条,这里是T2,那么根据T2在脏表中的数据update主表的值后将主表记录返回,同时删除脏表中的数据,之后T1,T3再来读取的话,当发现脏表无数据就直接返回主表的数据。 由此能够在不锁表的情况下实现高效率的并发访问。 |
|
返回顶楼 | |
发表时间:2009-08-10
by5739 写道 rain2005 写道 by5739 写道 rain2005 写道 可以在数据库里面建一个版本行。。。
如果提交a或者b就更新版本行 建版本好像不能解决问题啊,不管有没版本,都要先查询数据库有没有记录才能决定是插入还是不插入(或者更新),但是这个2个动作之间要是被人抢先插入,就会出问题 所以说才加个版本行啊,提交是看版本有没有变化撒,如果版本行版本发生变化就会滚事务,不是很easy的事么? 不太明白啊。。。比如顺序是这样的: a服务器检查DB发现没有数据 b服务器检查DB发现没有数据 b服务器插入版本为1,id=1的数据 a服务器插入版本为1,id=2的数据 id是db自动生成,这样好像不能控制数据唯一吧? 如何发现没有数据呢?所以才说要加版本行啊,不是版本列,在初始数据库数据是就插入这个版本行,插入数据时修改版本行数据,如果插入A或者B后版本行变化回滚就可以了。 |
|
返回顶楼 | |
发表时间:2009-08-10
乐观锁当然可以解决
|
|
返回顶楼 | |