事務

在jdbc中如何控制事務

在jdbc中通過connection來控制事務,在一個事務中可以放多個Statement
事務的四個特性:
原子性:一個事務(transaction)中的所有操作,要麼全部完成,要麼全部不完成,不會結束在中間某個環節。
一致性:在事務開始之前和事務結束以後,數據庫的完整性沒有被破壞。
隔離性:數據庫允許多個併發事務同時對其數據進行讀寫和修改的能力,隔離性可以防止多個事務併發執行時由於交叉執行而導致數據的不一致。
持久性:事務處理結束後,對數據的修改就是永久的,即便系統故障也不會丟失。
提供方法
setAutoCommit(false)//true爲自動提交,false爲手動提交
commit();//提交
rollback();//回退
示例:
購買圖書:

package jdbc1020;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class book {
	
	public static boolean buy(int userid,int bookid) throws Exception
	{
		Connection conn = jdbcUtil.getConnections();
		String update1="update bookstore set count = count-1 where bookid=?";
		String update2="update sys_user set remain=remain-(select price from book where bookid=?) where userid=?";
		
		String query1 ="select count from bookstore where bookid = ?";
		String query2="select remain from sys_user where userid = ?";
        conn.setAutoCommit(false);
		try(PreparedStatement ps = conn.prepareStatement(update1);
				PreparedStatement ps1 = conn.prepareStatement(update2);
				PreparedStatement ps2 = conn.prepareStatement(query1);
				PreparedStatement ps3 = conn.prepareStatement(query2)){
            
			ps.setInt(1, bookid);
			 
			ps.execute();
			
			ps1.setInt(1, bookid);
			ps1.setInt(2, userid);
			
			ps1.execute();
			
			ps2.setInt(1, bookid);
			ResultSet rs = ps2.executeQuery();
			rs.next();
			int count  = rs.getInt(1);
			
			ps3.setInt(1,userid);
			ResultSet rs1 = ps3.executeQuery();
			rs1.next();
			int remain = rs1.getInt(1);
			System.out.println(remain);
			if(remain>=0 && count>=0) {
				conn.commit();
			}else {
				throw new Exception("庫存不足或者餘額不足");
			}
			System.out.println("購買成功");
			return true;
			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			try{
				conn.rollback();
			}catch(SQLException e1) {
				e1.printStackTrace();
			}
		}finally {
			try{conn.close();
			}catch(SQLException e) {
				e.printStackTrace();
			}
		}
		
		return false;
		
	}
	public static void main(String[] args) throws Exception {
		buy(1,1);
	}
	

}


登錄練習

1、用戶信息表
uid,nickname,password,login_time,login_count,amount(累計積分)
2、登錄日誌
loginid,uid,login_time,score(分數)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章