Java事务和mysql事务关系_Java和MySQL事务

本文档描述了一个Java应用程序在多台计算机上运行时遇到的MySQL事务死锁问题。当并发调用bookSeats方法时,即使已提交事务,仍会出现DEADLOCK错误。解决方案包括在提交后重新启用自动提交或降低事务隔离级别到REPEATABLE_READ。
摘要由CSDN通过智能技术生成

我有一个在多台计算机上运行的Java应用程序,它们都连接到同一个MySQL数据库.我需要进行交易以确保正确更新数据库.

我有释放锁的问题.这是代码:

public boolean bookSeats(int numeroSala, Calendar dataOra, List posti) {

JDBConnection connection = JDBConnection.getDbConnection();

Connection conn = connection.conn;

java.sql.Date javaSqlDate = new java.sql.Date(dataOra.getTime().getTime());

java.sql.Time javaSqlTime = new java.sql.Time(dataOra.getTime().getTime());

try {

conn.setAutoCommit(false);

conn.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);

} catch (SQLException e) {

e.printStackTrace();

}

try

{

Posto p = null;

ListIterator itr = posti.listIterator();

PreparedStatement stmt = null;

stmt = conn.prepareStatement(

"INSERT INTO sala?_tickets " +

"(giornoSpettacolo, orarioSpettacolo, fila, posto) " +

"VALUES (?, ?, ?, ?)");

stmt.setInt(1, numeroSala);

while(itr.hasNext())

{

p = itr.next();

stmt.setString(2, javaSqlDate.toString()); // giornoSpettacolo

stmt.setString(3, javaSqlTime.toString()); // orarioSpettacolo

stmt.setInt(4, p.getFila()); // fila

stmt.setInt(5, p.getNumero()); // posto

stmt.addBatch();

}

stmt.executeBatch();

conn.commit();

return true;

}

catch (SQLException e) {

e.printStackTrace();

}

return false;

}

该方法可以正常工作,但是当我尝试同时在另一台计算机上执行此方法时,即使conn.commit()已完成,也会出现DEADLOCK错误.

一旦关闭第一个应用程序,其他应用程序即可运行该方法而不会出现死锁错误.好像COMMIT没有释放锁?

解决方法:

根据MySQL文档,关于SERIALIZABLE:

This level is like REPEATABLE READ, but InnoDB implicitly converts all

plain SELECT statements to SELECT … LOCK IN SHARE MODE if autocommit

is disabled.

您可能想要在提交后尝试重新启用自动提交,或尝试连接.改为REPEATABLE_READ.

标签:jdbc,transactions,java,mysql

来源: https://codeday.me/bug/20191201/2080103.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值