1.事務
データベーストランザクション(トランザクション)は、さまざまなデータ項目にアクセスし、場合によっては操作する一連のデータベース操作です。これらの操作は、実行されるか、まったく実行されないかのいずれかであり、分割できない作業単位です。トランザクションは、トランザクションの開始からトランザクションの終了までの間に実行されるすべてのデータベース操作で構成されます。
たとえば、銀行に送金する場合、操作は次の2つのステップに分けることができます。
(1)最初の口座からお金を引き出す。String sql1;
(2)2番目の口座にお金を入金します。String sql2;
このプロセスでは、2つのリンクが関連付けられています。**最初の口座からの資金は2番目の口座に正しく入金する必要があります。2番目のリンクが完了していない場合は、プロセス全体をキャンセルする必要があります。そうしないと、資金が失われるという問題が発生します。**トランザクションプロセス全体を1つのものと見なすことができます。成功はすべての成功を意味し、失敗はすべてのキャンセルを意味します。これにより、操作の途中で問題が発生した場合のデータの不整合を回避できます。
2.特定のJavaアプリケーション
プロジェクトでは、トランザクションを形成するために次の3つのステートメントが必要です
String sql = "insert into Train_ticket (user_id,train_id,start_station_name,end_station_name,carriage,seat_grade,seat_location,ride_time,start_time,end_time,price) " +
"values ('"+ticket.getUser_id()+"','"+ticket.getTrain_id()+"','"+ticket.getStart_station_name()+"','"+ticket.getEnd_station_name()+"',"+ticket.getCarriage()+","+ticket.getSeat_grade()+"," +
"'"+ticket.getSeat_location()+"','"+ticket.getRide_time()+"','"+ticket.getStart_time()+"','"+ticket.getEnd_time()+"',"+ticket.getPrice()+");";
String sql2 = "update Train_seat set occupy=0 where train_id='"+ticket.getTrain_id()+"' and carriage="+ticket.getCarriage()+" and seat_location='"+ticket.getSeat_location()+"'";
String sql3 = "insert into Ride_train values ('"+ticket.getUser_id()+"','"+ticket.getTrain_id()+"',' "+ticket.getRide_time()+" "+ticket.getStart_time()+"')";
アトミック性を確保する方法:
トランザクションのコミットとロールバックを使用する
トランザクションを構成するSQLステートメントをメソッドにカプセル化するか、不均等にコミットするか、不均等に失敗します
/***
* 数据库的事务并发控制
*/
public class Affairs {
static Connection conn=null;
static {
conn=DBConnection.getConnection();
}
public static int transaction_control(String sql[]){
Statement stmt = null;
int result = 0;
try {
// 开启事务
//不把其设置为true之前都是一个当作一个事务来处理
conn.setAutoCommit(false);
// 创造SQL语句
// 执行SQL语句
stmt = conn.createStatement();
for (int i = 0; i < sql.length; i++) {
stmt.executeUpdate(sql[i]);
}
// 提交事务
conn.commit();
System.out.println( "OK!" );
}
//发生任何错误均需回滚
catch (SQLIntegrityConstraintViolationException e3) {
result = -1;//主码冲突,返回支付失败
try {
// 回滚事务
//撤销上面对事务的所有操作哈!
conn.rollback();
} catch (SQLException e2){
}
} catch (Exception e) {
e.printStackTrace();
System.out.println("有错误!");
try {
// 回滚事务
//撤销上面对事务的所有操作哈!
conn.rollback();
} catch (SQLException e2){
}
}
return result;
}
}
ツールDBConnection
//com.mysql.cj.jdbc.Driver数据库驱动
private static final String DBDRIVER="com.mysql.cj.jdbc.Driver";
//IP地址202.194.14.120 端口号3306 数据库的名字TrainTicketSystem
private static final String DBURL="jdbc:mysql://localhost:3306/TrainTicketSystem?&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true";
//用户名root
private static final String DBUSER="root";
//密码***
private static final String DBPASSWORD="***";
static {
try {
Class.forName(DBDRIVER);
System.out.println("加载驱动成功");
} catch (ClassNotFoundException e) {
e.printStackTrace();
System.out.println("加载驱动失败");
}
}
public static Connection getConnection() {
Connection conn=null;
try {
conn=DriverManager.getConnection(DBURL,DBUSER,DBPASSWORD);
System.out.println("连接成功");
} catch (SQLException e) {
// TODO: handle exception
e.printStackTrace();
System.out.println("发生连接异常");
}
return conn;
}
3.鍵
実行前に、conn.setAutoCommit(false)が必要です。自動
送信がSQLステートメントと同等である場合、この文は自動送信を設定しません。conn.setAutoCommit(true)の場合、自動送信を設定します。最初のセンテンスは送信でき、データベースには対応するレコードがありますが、エラーが報告された場合、2番目のセンテンスをロールバックすることはできません。
概要:トランザクションがロールバックされる前に、conn.setAutoCommit(false);このように、次のステートメントはトランザクションと同等です。エラーが発生すると、すべての操作が取り消されます。