Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从何处设置java代码的事务隔离级别?_Java_Mysql - Fatal编程技术网

从何处设置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(),因为我不知道把它放在哪里:)