簡體   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