针对12306网站购买火车票有三个事务T1,T2,T3同时执行,T1事务是购买今天G2车次的3张上海到北京车票,T2事务是对今天G2车次的5张上海到北京车票进行改签,改签到今天G6车次的5张上海到北京车票。 T3事务是对今天所有上海到北京车票进行统计操作。其中X、Y分别代表G2车次和G6车次的已售车票总数。 ① 请判断下面的并发操作都存在什么问题? ② 尝试给出针对这种情况具体可串行化调度的正确封锁操作过程,并阐述理由。 T1 T2 T3 Read (X) Read (X) Read (X) X= X+3 X=X-5 Read (Y) Write(X) Sum=X+Y Write(X) Read (Y) Y=Y+5 Write(Y) Read (X) Read (Y) Sum=X+Y Write (Sum)
时间: 2024-01-16 08:03:26 浏览: 102
12306订火车票流程
1. 这三个并发操作存在以下问题:
- T1和T2存在写-写冲突,即T1将X加3之后,T2又将X减5,导致X的值不确定。
- T2和T3存在读-写冲突,即T2在改签之后需要读取X的值并写回,此时如果T3也在进行统计操作,会读取到T2改签之前的X值,导致统计结果不准确。
2. 具体可串行化调度的正确封锁操作过程如下:
- T1开始执行,对X进行读操作,并且对X加3,此时对X加排它锁。
- T2开始执行,对X进行读操作,需要等待T1释放X的排它锁,然后T2对X加排它锁,并且对X减5。
- T3开始执行,对X进行读操作,需要等待T2释放X的排它锁,然后T3对X加共享锁,对Y进行读操作,然后对Y加排它锁,并且将Y加5。
- T2完成操作后,释放X的排它锁,并且将修改写回数据库。
- T1完成操作后,释放X的排它锁,并且将修改写回数据库。
- T3完成操作后,释放Y的排它锁和X的共享锁,并且将统计结果写回数据库。
这种封锁操作可以保证并发操作的正确性和可串行化,避免了读写冲突和写写冲突的问题。
阅读全文