书上说并发控制的主要技术是封锁。例如两个售票口同时要售票,假设数据库为A,为了让甲卖出一张票后,A中票的数量减一,甲要修改A,为了不丢失甲的修改,须在读除A前先封锁A,直到甲修改并返回A后解除了对A的封锁为止。这样就不会在乙售票的时候看到那张卖出的票。我的疑问是:假设甲读取A前封锁A(应该是写锁吧),那么乙要写A的话,就必须等到甲解锁了。假设甲一直不解锁(或者是很长时间以后再解锁),那乙岂不是卖不了票了(或者要等很长时间)。我觉得这样在现实中是不可取的。请高人解惑。我刚学数据库。大家见谅!~
解决方案 »
- 该条语句运行好久,什么问题,该如何优化
- mysql真正读上一条下一条的SQL有没有???
- innodb 快照原理 解惑。。跪求高手解答·
- 几个小问题。
- Commit exception overridden by rollback exception
- 如何设置权限,控制MYSQL数据库资料的导出?
- mysql中,如何获得刚插入一条记录的ID号,系统需要刚插入记录的Id做一些处理!急!急!!
- 用phpMyAdmin-2.5.4导入数据的问题?
- 前端工具
- MySQL: Unknown character set: 'utf8mb4怎么解决
- 急急急!!mysql主从服务器的启动问题
- 利用mysql数据库开发,需要学习mysql那些东西呀?
在发生锁到解锁,中间必须避免交互性操作。让一个事务竞可能地短,才能提高并发.所以出现了一种模式,广泛应用各种语言的控件,这叫BATCH UPDATE
SELECT * FROM XXX -- 产生旧值--- 中间是交互性修改提交时再加锁,
BEGIN TRANSACTION
SELECT * FROM XXX FOR UPDATE -- 加锁, 并产生新值
IF 新值=旧值 -- 说明你在交互性修改中,服务器上的数据没有被别人修改
UPDATTE
ELSE -- 已被修改
-- ROLLBACK 或者处理其他流程
END IF
COMMIT
在发生锁到解锁,中间必须避免交互性操作。让一个事务竞可能地短,才能提高并发.所以出现了一种模式,广泛应用各种语言的控件,这叫BATCH UPDATE
SELECT * FROM XXX -- 产生旧值--- 中间是交互性修改提交时再加锁,
BEGIN TRANSACTION
SELECT * FROM XXX FOR UPDATE -- 加锁, 并产生新值
IF 新值=旧值 -- 说明你在交互性修改中,服务器上的数据没有被别人修改
UPDATTE
ELSE -- 已被修改
-- ROLLBACK 或者处理其他流程
END IF
COMMIT