nber1994



mysql事务并发导致的问题

October 20, 2017

胡乱探讨了事务并发的问题与处理方法

mysql的事务并发

事务并发问题

事务隔离级别

为了解决数据库事务并发运行时的各种问题数据库系统提供四种事务隔离级别:

并发控制

常用的解决方法

罗列的技术有些是数据库系统已经实现,有些需要开发者自主完成。

版本检查

在数据库中保留标识版本的字段,跟随数据同时读写,一次判断数据版本马版本可能是时间戳或者状态字段


UPDATE table SET status = 1 WHERE id=1 AND status = 0;

版本检查能够作为乐观锁,解决更新丢失问题

共享锁与排它锁

共享锁(Shared locks, S-locks)

排它锁(Exclusive locks, X-locks)

更新锁(Update locks, U-locks)

临时锁与持续锁

锁的时效性。指明了加锁生效期是到当前语句结束还是当前事务结束。

表级锁与行级锁

锁的粒度。指明了加锁的对象是当前表还是当前行。

悲观锁与乐观锁

这两种锁的说法,主要是对“是否真正在数据库层面加锁”进行讨论。

悲观锁(Pessimistic Locking)

悲观锁假定当前事务操纵数据资源时,肯定还会有其他事务同时访问该数据资源,为了避免当前事务的操作受到干扰,先锁定资源。悲观锁需使用数据库的锁机制实现,如使用行级排他锁或表级排它锁。 j####
尽管悲观锁能够防止丢失更新和不可重复读这类问题,但是它非常影响并发性能,因此应该谨慎使用。

乐观锁(Optimistic Locking)

乐观锁假定当前事务操纵数据资源时,不会有其他事务同时访问该数据资源,因此不在数据库层次上的锁定。乐观锁使用由程序逻辑控制的技术来避免可能出现的并发问题。

唯一能够同时保持高并发和高可伸缩性的方法就是使用带版本检查的乐观锁。

乐观锁不能解决脏读的问题,因此仍需要数据库至少启用“读已提交”的事务隔离级别。