我是springboot的新手,我正考虑将它用于新项目。 在测试其功能时,我一直未能使用 @Transactional 注释。
我创建了一个我连接的MySql数据库,设置了这个 application.properties 文件:
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3311/mb
spring.datasource.username=mb
spring.datasource.password=password
spring.datasource.tomcat.default-auto-commit=false
以下是我用来访问数据库的一个小类。 在 insertUser(...)方法中,我有意无意地重复了insert语句,因此第二个insert语句会因为表的主键上的重复条目而导致回滚。
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.ObjectUtils;
import org.springframework.util.StringUtils;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
@Repository
@Transactional
public class UserRepository {
protected final Logger log = LoggerFactory.getLogger(getClass());
@Autowired
protected JdbcTemplate jdbc;
public User getUser(long id) {
return jdbc.queryForObject("SELECT * FROM test_table WHERE id=?", userMapper, id);
}
public List<User> getUsers(long[] ids) {
String inIds = StringUtils.arrayToCommaDelimitedString(ObjectUtils.toObjectArray(ids));
List<User> u= jdbc.query("SELECT * FROM test_table WHERE id IN (" + inIds + ")", userMapper);
return u;
}
@Transactional
public int insertUser(User u) {
int total = jdbc.update("insert into test_table values ('"+u.id+"', '"+u.firstname+"', 'toto', '"+u.email+"', NOW())");
//second insert that will cause an exception due to a duplicate key on PK (first column)
total += jdbc.update("insert into test_table values ('"+u.id+"', '"+u.firstname+"', 'toto', '"+u.email+"', NOW())");
return total;
}
private static final RowMapper<User> userMapper = new RowMapper<User>() {
public User mapRow(ResultSet rs, int rowNum) throws SQLException {
User user = new User(rs.getLong("id"), rs.getString("firstname"));
user.email = rs.getString("email");
System.out.println("recup du user "+user.id + user.firstname);
return user;
}
};
}
即使java抛出异常,查看数据库也会显示回滚永远不会发生,并且第一次插入是持久的。
为什么?
答案 0 :(得分:2)