(刚学不久,用自己的话总结的,见谅各位。
如有不对的地方,也会尽快更改。
谢谢各位!
)
1.先根据数据库创建的表创建一个实体类,并生成get和set方法。
2.在创建一个接口写两个方法,根据ID获取对象和修改对象两个方法。
3.
上图两个测试方法是对数据库的表数据进行测试,根据之前写的两个方法来对标数据操作。(test20和test21会以线程1,线程2称呼)
这是数据库原本的数据。
4.先对线程1进行测试,第一步获取数据库的数据
在对线程2进行测试,获取数据库的数据
两个线程获取的数据都是一样的
5.让线程1执行完
这里已经对数据库的某列值进行跟新
6.在让线程2执行完
线程2也对数据库某一列执行完,并更改了数据
7.问题来了,线程1对数据库的修改过后的数据,线程2确并没有拿线程1修改的数据去更改,这就导致线程1修改的数据被线程2覆盖了。
8.所以我们就要在select语句最后加for update。
作用:让线程1获取的数据库记录上锁,其他线程获取 不到线程1这条数据记录。只有等线程1执行完 放锁之后,其他线程才能对线程1操作的记录进 行操作。
9.
加了for update后线程1获取的数据
线程2此时拿不到数据
线程1执行完毕
等线程1执行完在执行线程2,才能修改。
总结:
悲观锁就是在select语句最后加上for update关键字(本质上就是行锁),给一条记录加行锁,确保一个时间点只能有一个事物去操作记录,其他事物只能等待。