SQL/Spring中的事务原子性意味着什么,它意味着什么?
我在考虑以下情况.如果我错了,请纠正我:
此代码不正确:
@Transactional
public void voteUp(long fooId) {
Foo foo = fooMapper.select(fooId); // SELECT * FROM foo WHERE fooId == #{fooId}
foo.setVotes(foo.getVotes() + 1);
fooMapper.update(foo); // UPDATE foo SET votes = #{votes} (...) WHERE fooId == #{fooId}
}
Run Code Online (Sandbox Code Playgroud)
即使它的事务处理并不意味着"投票"的值总是会增加1,如果在很多机器/许多线程中同时调用voteUp?如果它是这样的话,那意味着一次只能执行一个事务,导致效率下降(特别是如果voteUp代码在事务中做了更多的东西)?
唯一正确的方法就是这样(?):
/* not necessarily */ @Transactional
public void voteUp(long fooId) {
fooMapper.voteUp(fooId); // UPDATE foo SET votes = votes + 1 WHERE fooId == #{fooId}
}
Run Code Online (Sandbox Code Playgroud)
在示例中,我使用myBatis连接到数据库,但我认为如果我使用hibernate或纯SQL语句,问题就会保持不变.
我意识到在javascript中所有101/100,"101"/ 100,101 /"100"和"101"/"100"导致1.01(在Chrome,FF和IE11上检查).但我找不到有关此行为的文档.
因此,我的问题是,如果(跨浏览器)使用此功能是安全的,并且如果这样做是一个好习惯(或者如果变量可以是字符串,则在分割之前使用parseInt)?