从何处设置java代码的事务隔离级别?
我必须创建一个预订系统,在该系统中,我想为从何处设置java代码的事务隔离级别?,java,mysql,Java,Mysql,我必须创建一个预订系统,在该系统中,我想为createBooking()方法的事务设置隔离级别。 我希望在创建新预订并将其保存到数据库时,事务可以序列化。在我的java类中,我在哪里做这件事? 我有一个连接类、一个BookingDatabase数据访问对象类和一个BookingController,它从GUI类创建预订 编辑:包括我的BookingDatabase DAO类,以显示我想要隔离级别的位置 import java.sql.Connection; import Database.*;
createBooking()
方法的事务设置隔离级别。
我希望在创建新预订并将其保存到数据库时,事务可以序列化。在我的java类中,我在哪里做这件事?
我有一个连接类、一个BookingDatabase
数据访问对象类和一个BookingController,它从GUI类创建预订
编辑:包括我的BookingDatabase DAO类,以显示我想要隔离级别的位置
import java.sql.Connection;
import Database.*;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import Model.Booking;
import Model.Room;
import Model.TimeInterval;
import Model.User;
public class BookingDatabase implements BookingDatabaseInterface {
private static final String INSERT = "insert into Booking (roomName, title, bookingDescription, timeinterval, bookingDate, username) values (?, ?, ?, ?, ?, ?)";
private PreparedStatement insertPS;
private static final String DELETE = "delete from Booking where bookingId = ?";
private PreparedStatement deletePS;
private static final String FIND_BOOKINGS = "select r.roomName, r.roomNumber, r.location, r.roomDescription, "
+ " u.username, u.password, u.emailAddress, u.phoneNo, employeeId, u.adminId, "
+ " b.roomName, b.title, b.bookingDescription, b.timeinterval, b.bookingdate, b.username "
+ " from Room as r, Users as u, Booking as b where b.roomName = r.roomName and b.username = u.username ORDER BY r.roomName";
private PreparedStatement findBookingsPS;
private static final String GET_BOOKING_Q = "select r.roomName, r.roomNumber, r.location, r.roomDescription, "
+ "u.username, u.password, u.emailAddress, u.phoneNo, employeeId, u.adminId, "
+ " b.roomName, b.title, b.bookingDescription, b.timeinterval, b.bookingdate, b.username "
+ " from Room as r, Users as u, Booking as b where b.roomName = r.roomName and b.username = u.username and bookingId = ?";
private PreparedStatement getBookingPS;
private RoomDatabase roomDatabase;
private UserDatabase userDatabase;
private Connection connection = DBConnection.getInstance().getConnection();
// Initialize class, get connection and initialize prepared statements
public BookingDatabase(RoomDatabase roomDatabase, UserDatabase userDatabase) throws SQLException{
init();
this.roomDatabase = roomDatabase;
this.userDatabase = userDatabase;
}
private void init() throws SQLException{
Connection con = DBConnection.getInstance().getConnection();
insertPS = con.prepareStatement(INSERT, Statement.RETURN_GENERATED_KEYS);
deletePS = con.prepareStatement(DELETE, Statement.RETURN_GENERATED_KEYS);
findBookingsPS = con.prepareStatement(FIND_BOOKINGS);
getBookingPS = con.prepareStatement(GET_BOOKING_Q);
connection.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);
}
@Override
public int insert(Booking booking) {
try {
DBConnection.getInstance().startTransaction();
connection.createStatement().execute("LOCK TABLES `Booking` WRITE");
// Get the variables fromTime and ToTime to set into TimeInterval in database
String fromTime = booking.getTimeInterval().getFromTime();
String toTime = booking.getTimeInterval().getToTime();
// Combine the two strings into a single string
String timeInterval = fromTime + "," + toTime;
// Insert attributes into booking
insertPS.setString(1, booking.getRoom().getRoomName());
insertPS.setString(2, booking.getTitle());
insertPS.setString(3, booking.getBookingDescription());
insertPS.setString(4, timeInterval);
insertPS.setString(5, booking.getDate());
insertPS.setString(6, booking.getUser().getUserName());
// Run query
insertPS.executeUpdate();
// find and return a bookingId
ResultSet resultSet = insertPS.getGeneratedKeys();
resultSet.next();
connection.commit();
connection.createStatement().execute("UNLOCK TABLES");
DBConnection.getInstance().commitTransaction();
return resultSet.getInt(1);
} catch (SQLException e) {
try {
DBConnection.getInstance().rollbackTransaction();
throw new RuntimeException("Transaction rollback");
} catch (SQLException e1){
throw new RuntimeException(e1);
}
}
}
连接
类有一个方法。就你而言:
Connection con=//创建连接。。。
con.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);
我说的连接类是我自己创建的,其中有startTransaction()commit()等,所以它没有setTransactionIsolation。您认为我应该在myConnection类中将其设置为可序列化吗?我不知道我是否希望所有事务都是可序列化的,只有那些关于createBooking()@Torben的事务可能在引擎盖下面的某个地方有一个java.sql.Connection
对象。启动createBooking
的相关事务时,需要调用此选项。如果你想知道这些代码在什么地方适合你,你需要分享这些代码:-)我现在已经编辑了我的文章,所以你应该可以看到这些代码。现在,我在init()方法中调用了setTransactionIsolation(),因为我不知道把它放在哪里:)