丢失更新: 当两个事物或多个事务都更新了同一条数据,但是这些事务彼此之间都不知道其他事务进行的修改,因此第二个更改覆盖了第一次的更改,说白了,就是事务A还没有提交之后,但是这个时候事务B更新了数据,那么事务A就丢失更新了。
解决方案: 乐观锁+悲观锁
悲观锁: 数据库的一种锁机制,悲观锁分成两种,分别是共享锁和排它锁
添加共享锁方式:select * from account lock in share mode ;
添加排它锁方式:select * from account for update;
下面说一下共享锁: 共享锁就是,例如 我在客户端A 给数据C 添加了共享锁,此时我在客户端B只能添加共享锁进行查看,没有修改的权利,如果我想要在客户端B进行修改,我只能在A处commit才能进行修改。
下面说一下排它锁:排它锁就是我在客户端A 给数据C添加了排它锁,那么我在客户端B只能在客户端 A commit之后,才能select数据,换句话说,只要我在客户端B用锁进行了查询,那我我都需要等待Acommit之后,如果此时我客户端B不加锁,我是可以查询到的。这个排它锁很像数据库隔离级别中的最高的隔离级别。但是排它锁是锁住了一条数据,而排它锁是锁上了这条数据。
说完了悲观锁,那么我们在说说乐观锁。
乐观锁:就是假设丢失更新不存在,它使用的是数据库的字段进行加测。 例如我在我的字段中添加一个字段,字段的类型是 timestamp 在插入和修改时 都会自动更新为当前时间 ,我根据我的sql条件进行判断,如果我的时间不符合,那么我的跟新失败。