同一时间多个事务并发更新同一行数据,且更新后的数据是基于更新前的数据,造成了更新丢失的问题。
我将事务的隔离级别设置为了最高的 SERIALIZABLE ,但发现并不能解决这个问题。
在并发事务处理带来的问题中,“更新丢失”通常应该是完全避免的。但防止更新丢失,并不能单靠数据库事务控制器来解决,需要应用程序对要更新的数据加必要的锁来解决,因此,防止更新丢失应该是应用的责任。
这段话是引用的别人文章中的话,不是很理解。
我的想法有两种:
1、在后台程序中将并发的事务强制变为同步串行执行,但总感觉哪里不妥
2、控制数据库让多个事务对同一行数据进行操作时,不论读写,直接锁死该行数据,先来的事务获得读写的权限,事务完成,下一个事务再获取读写的权限进行操作,但问题如何实现啊?
请各位帮忙解疑,如果你能详细说明下在 node.js 、mysql、sequelize 中如何处理这样更好。
会话的隔离级别设置为serializable的时候,其他会话对该表的写操作将被挂起;但是还是可以读取数据的,因此根据读取的数据做更新还可能会有问题。
应用程序中为了防止核心数据被并发修改,一般在查询数据的语句中增加for update的选项,从数据库层面避免造成同一条数据被两个事务同时进行操作。