java+数据库锁篇

java+数据库锁篇

        最近在公司遇到一个问题,就是关于脏数据的处理,就是用户在添加或改变某条数据时,同时访问一个方法,导致插入两条数据或者是将值改变几次。

java的synchronized关键字       

         以前了解synchronized关键字的用法,但并没有实际用过,所以在我们业务量不大的情况下,这个是可以满足要求的,保证并发。但是,在A方法未执行完时,是无法返回正确的值,所以在同时访问A方法的其他请求时,还是无法得到正确的值,这个时候需要在数据库上做文章。

 数据库锁:

        其他的分类不说了,接下来说一下悲观锁和乐观锁。

        悲观锁分类

          1.表锁,对整张表都处于会一直更新的状态都锁住。

          2. 行锁,锁的作用范围是行级别,数据库能够确定那些行需要锁的情况下使用行锁,如果不知道会影响哪些行的时候就会使用表锁。举个例子,一个用户表user,有主键id和用户生日birthday当你使用update … where id=?这样的语句数据库明确知道会影响哪一行,它就会使用行锁,当你使用update … where birthday=?这样的的语句的时候因为事先不知道会影响哪些行就可能会使用表锁。

        乐观锁    

           1. 顾名思义,就是很乐观,每次自己操作数据的时候认为没有人回来修改它,所以不去加锁,但是在更新的时候会去判断在此期间数据有没有被修改,需要用户自己去实现。既然都有数据库提供的悲观锁可以方便使用为什么要使用乐观锁呢?对于读操作远多于写操作的时候,大多数都是读取,这时候一个更新操作加锁会阻塞所有读取,降低了吞吐量。最后还要释放锁,锁是需要一些开销的,我们只要想办法解决极少量的更新操作的同步问题。换句话说,如果是读写比例差距不是非常大或者你的系统没有响应不及时,吞吐量瓶颈问题,那就不要去使用乐观锁,它增加了复杂度,也带来了额外的风险。
            2.一般使用乐观锁的方式就是就是加个版本号字段,或者时间戳。很简单。

猜你喜欢

转载自blog.csdn.net/weixin_37525569/article/details/79958250