[英]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.