有二个事务T、U,下面的并发操作是否正确,若不正确请使用时间戳方法解决其冲突。 ts(T)<ts(U) T U read(b) read(b) write b=b+300 write b=b-300 设有二个事务T、U,下面的并发操作是否正确,若不正确请使用时间戳方法解决其冲突(设ts(T)>ts(U))。 T U read(b) read(b) write b=b+300 write b=b-500
解决方案 »
- SQL语句的问题~~
- xp sp2上装SQL2005 提示操作系统不支持,应该装什么操作系统
- Microsoft OLE DB Provider for SQL Server 错误 '80040e31'ODBC SQL Server Driver]超时已过期,程序没有错,可是为什么还一段时间用ASP
- 请教高手,这样的SQL语句怎么写,完成成上结贴(100)
- 急!请高手指教!在软件园的服务器旁等!触发器的问题!
- 一个关于想了好长时间都想不通的问题
- 如何提取日期最新的记录
- 我在本机上装了sql server客户端,但在写存储过程时,查询分析器中不能调试,而在服务器上是可以的,应做些什么设置呢?
- 一个很基础的问题。。。
- 新人求:不固定列转行语句。
- sql server 连接不上
- 看看这SQL语句哪里错了?
如果两个事务都是在write完毕后立即提交,那么这两个事务应该都是正确的。
在第一个例子中T先读取b,读完后释放共享锁,然后U又读取b,读完后释放共享锁,接着U改写b,并提交U事务(U事务释放排它锁),最后T改写b,并提交T事务(T事务释放排它锁)。
在第二个例子中U先读取b,读完后释放共享锁,然后T又读取b,读完后释放共享锁,接着U改写b,并提交U事务(U事务释放排它锁),最后T改写b,并提交T事务(T事务释放排它锁)。
在第一个例子中,如果执行T事务的用户重新查询b,会发现b的值没有变,因此该用户会抱怨他的数据除了问题。可以用事件戳解决这个问题,在T和U查询b的时候要把该记录的时间戳一起获取,T查询b时同时获得ts(b),U查询b时同时获得ts(b)。U在改写b时,把自己先前获得的时间戳与记录的实际时间戳比较,发现相等(两者都是ts(b)),于是成功更新纪录,更新的同时把记录的实际时间戳改写为ts(U),而后T进行修改数据前,把自己先前得到的时间戳和记录的实际时间戳比对,发现不相等(一个是ts(b),另一个已经变成了ts(U)了),因此发生更新失败,T需要重新查询以便获得新的时间戳和U新改写的b,然后继续修改数据。
学习ing以前在设计的时候从来没考虑时间戳的问题