繁体   English   中英

无法获取锁定异常:锁定等待超时超过Spring SQL

[英]Cannot aquire lock exception: lock wait timeout exceeded spring sql

嗨,正如标题所示,我在这里遇到了超时异常,我没有找到任何相关的答案,因为这是唯一的交易。 同样,当我取消交易状态时,我的测试也通过了。 我的创建方法:

@Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW)
public void createAMember(int memberid, String name, String address1, String address2, String town, String contact_number, int bookallowance, double balance, boolean active) {
    String SQL = "insert into member (id,name,address1,address2,town,contact_number,book_allowance, balance, active) values (?,?,?,?,?,?,?, ?, ?)";
    getJdbcTemplate().update(SQL, new Object[] { memberid,name,address1,address2,town,contact_number,bookallowance,balance,active});
    System.out.println("Created Member Name = " + name + " memberid= " + memberid);
    //throw new libException();

}

我的实际测试:

@Test
@DatabaseSetup(value="classpath:dbEntries.xml", type=DatabaseOperation.CLEAN_INSERT)
public void testCreateMember() throws SQLException{
    MemberDaoJDBCTemplate memberDaoJDBCTemplate=(MemberDaoJDBCTemplate)autoWireContext.getBean("memberDaoJDBCTemplate");
    //int firstCount=memberDaoJDBCTemplate.countAllMembers();
    memberDaoJDBCTemplate.createAMember(id,Name, Address1,Address2,Town,Contact_number,book_allowance,Balance,active);
    System.out.println("kafka");
    //int secondCount=memberDaoJDBCTemplate.countAllMembers();
    //assertNotEquals(firstCount, secondCount); 
}

我的数据源bean:

<bean id="dataSource" 
    class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://localhost:3306/library"/>
    <property name="username" value="root"/></bean>

我对此很陌生,所以如果我可以添加任何内容,请说,我已经努力了一段时间,所以任何提示都值得赞赏。Edit1:这是我正在运行的唯一测试,即createAMember

似乎我问的是一个晦涩难懂的问题,或者是我以错误的方式提出的。 无论如何,在拉了很多头发之后,我找到了这个问题的答案。 我的原始代码实际上在这里尝试CreateAMember

public void createAMember(int memberid, String name, String address1, String address2, String town, String contact_number, int bookallowance, double balance, boolean active) { String SQL = "insert into member (id,name,address1,address2,town,contact_number,book_allowance, balance, active) values (?,?,?,?,?,?,?, ?, ?)"; getJdbcTemplate().update(SQL, new Object[] { memberid,name,address1,address2,town,contact_number,bookallowance,balance,active}); System.out.println("Created Member Name = " + name + " memberid= " + memberid); //throw new libException();

在识别类型并将其整齐地放在准备好的语句中时,必须结构更整洁。 下面的重新跳动为我工作。 PreparedStatementCreatorFactory psc=new PreparedStatementCreatorFactory(SQL); psc.addParameter(new SqlParameter("id", Types.INTEGER)); psc.addParameter(new SqlParameter("name", Types.VARCHAR)); psc.addParameter(new SqlParameter("address1", Types.VARCHAR)); psc.addParameter(new SqlParameter("address2", Types.VARCHAR)); psc.addParameter(new SqlParameter("contact_number", Types.VARCHAR)); psc.addParameter(new SqlParameter("book_allowance", Types.INTEGER)); psc.addParameter(new SqlParameter("balance", Types.DOUBLE)); psc.addParameter(new SqlParameter("active", Types.BOOLEAN)); Object[] params=new Object[]{memberid,name, address1, address2, town, contact_number, bookallowance, balance,active}; KeyHolder holder = new GeneratedKeyHolder(); getJdbcTemplate().update(psc.newPreparedStatementCreator(params), holder); System.out.println("holder:"+holder.getKey().toString()); System.out.println("Created Record Name = " + name + " ID = " + memberid);

我最初的方法适用于纯JDBC交互,而这正是引起混淆的地方。 事务需要如上所示的结构。 我希望这篇文章可以在某个时候像我一样帮助一个无知的人。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM