JavaEE容易忽略的问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/JacXuan/article/details/79527843

1.丢失更新。

数据库:oracle

情况描述:user1和user2同时执行相同的查找条件,user1将张三的Address字段修改了,之后user2更新张三的phone字段(和user1的操作时间无需同时,仅仅是接近也会出现这个问题),user1再次查找张三的信息时,发现Address还是原来的数据。
接到客户“投诉”时,有很多开发者会将这种错误归咎于客户操作错误,因为这种情况概率极小,非常难以重现。但实际上是由于user2查询的还是user1更新之前的数据,那么对于张三这条数据来说,user1的更新操作就相当于丢失了,张三的地址并没有被修改。

解决方案
a.悲观锁定:在执行关键的信息查询时使用

select * from t where name=“张三”for update nowait

优缺点:
使用悲观锁定时,在user1查询的期间都将锁定数据,当user2执行更新时,sql将等待或者提示“resource busy”。这会造成性能方面缺失,但是不会覆盖更新且user2无需重新提交修改。

b.乐观锁定
使用

update t set phone = “XXX” where id = “xxx”

扩展:for update 和 for update nowait 的区别
for update 和for update nowait主要区别在于是否等待,如果不加nowait,在执行select时就会报错,如果加了nowait,在执行select时就会等待,直至锁被释放。
https://www.cnblogs.com/mouseIT/p/4174157.html

2.数据库更新列导致列被删除

使用

Alter table t Modiify(cloumn number)

修改列值时,数据库其实先执行删除后执行插入已达到更新的效果。如果插入的时候因为某种原因失败了,会导致数据库丢失此列的信息。

展开阅读全文

没有更多推荐了,返回首页