起因是我的代码中更新方法和同事写的不一样
数据层用的mybatis,数据库用的mysql
我的写法
Student s= studentDao.selectById("123");
.......//业务操作
Student sTemp = new Student();
sTemp.setId("123");
sTemp.setSex(0);
studentDao.update(sTemp);
然后我同事是这么写的
Student s= studentDao.selectById("123");
.......//业务操作
s.setId("123");
s.setSex(0);
studentDao.update(s);
那么这里有个问题在mybaits中是判断这个字段有就会加上更新语句
数据库原数据
id name sex weight
123 张三 1 120
比如这两段代码执行完成后
我的sql
update Student set sex=0 where id='123';
我同事的sql
update Student set name="张三",sex=0,weight="120" where id='123';
我的做法弊端在于 new了一个对象
我自己的想法是为了节约全字段更新数据的sql执行时间,还有mybatis的的sql拼接
问题1:
数据相同时这两种sql有没有性能差异?我实际测试的时候好像并没有看出有差异,希望有人能告诉我原理
问题2:
以上两种方法到底哪种方法才是正确的
楼上大致正确,但是
1.前者也是通用的,但要多写一些 setXXX 的代码;
2.第二种方式在并发情况下容易导致前面的update失效,除非整个过程加锁:
请求1:
update Student set name="李四";
请求2:
update Student set name="张三",sex=0,weight="120" where id='123';
期望结果:
name="李四",sex=0,weight="120" where id='123'
实际结果:
"张三",sex=0,weight="120" where id='123'
原因:
请求2 setXXX 时,请求1正在执行SQL语句update1,这时候MySQL会加锁。
等到update1执行完后,请求2的SQL语句update2再执行,导致原本update1修改后的
name="李四"又被update2改回了name="张三"。
所以如果要用完整更新,请求2必须在setXXX前加锁,让update1在update2完成后才执行,这样才能避免并发情况下导致前面的update失效的问题。