1. 程式人生 > >【JDBC】資料庫事務

【JDBC】資料庫事務

之前因為教師斷了一次網,然後又開始學前端,和js做了一個多月的鬥爭,回過神要講Spring了才發現部落格已經冷了很久了。。。慢慢補上吧

今天先把資料庫事務的一個案例記一下,也是前幾個星期剛剛才會寫的。。

package mjy.kuguan.ruku.dao.impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.text.SimpleDateFormat;
import java.util.Date;

import mjy.common.util.jdbc.JdbcUtil;
import mjy.common.util.jdbc.TransactionManager;
import mjy.kuguan.ruku.dao.RukuUserDao;
import mjy.kuguan.ruku.po.DiaoborukuPO;

/**
 * 調撥單用事務:調撥入庫單刪除 與 已完成入庫表插入
 * @author student
 *
 */
public class DiaoboTransaction {
	//設定本類入庫型別顯示內容
	private final String RUKU_TYPE = "調撥入庫";
	
	private Connection conn;
	private PreparedStatement prep;
	private TransactionManager transactionManager;
	private RukuUserDao rukuUserDao = new RukuUserDaoImpl();
	
	/**
	 * 【事務操作】
	 * 將該條調撥入庫單1.插入入庫完成表 2.從採購入庫表中刪除
	 * @param diaoborukuPO
	 * @param wanchengChecker
	 */
	public void diaoboruku(int diaoboBossId, DiaoborukuPO diaoborukuPO, int wanchengChecker){
		//獲取連線
		conn = JdbcUtil.getConnection();

		//將連線部署於事務管理
		transactionManager = JdbcUtil.getTransactionManager();
		
		//開啟事務,關閉自動提交
		transactionManager.startTransaction();
		
		/*	事務執行主體	*/
		
		//插入語句
		String sqlInsert = "insert into kuguan_rukuwancheng values(?,?,?,?,?,?,?,?,?,?,?)";
		//刪除語句
		String sqlDelete = "delete from kuguan_diaoboruku where diaoboBossId = ? and diaoboCode = ?";
		
		try {
			//執行插入操作
			prep = conn.prepareStatement(sqlInsert);
			prep.setString(1, Thread.currentThread().hashCode() + "-" + System.currentTimeMillis());
			prep.setInt(2, diaoboBossId);
			prep.setString(3, diaoborukuPO.getDiaoboCode());			//設定入庫單編號
			prep.setString(4, diaoborukuPO.getDiaoboDiaobodanCode());	//設定相關單據號
			prep.setString(5, RUKU_TYPE); 								//設定入庫型別
			prep.setInt(6, diaoborukuPO.getDiaoboInCount()); 			//設定入庫數量
			prep.setString(7, diaoborukuPO.getDiaoboSetTime()); 		//設定制單時間
			prep.setInt(8, rukuUserDao.getSelectIdByName(diaoborukuPO.getDiaoboAuthor()).get(0)); 			//設定制單人
			prep.setInt(9, wanchengChecker); 						//設定確認人(唯一輸入項)
			prep.setString(10, new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));//設定確認時間
			prep.setString(11, diaoborukuPO.getDiaoboNote()); 			//設定本單備註
			prep.executeUpdate();
			
			//int i=1/0;	//測試
			
			//執行刪除操作
			prep = conn.prepareStatement(sqlDelete);
			prep.setInt(1, diaoboBossId);
			prep.setString(2, diaoborukuPO.getDiaoboCode());
			prep.executeUpdate();
			
		} catch (Exception e) {//此處Exception應包含上述所有可能異常
			// 期間出現異常時,回滾&釋放連結
			transactionManager.rollbackAndClose();
			e.printStackTrace();
			return;//防止執行finally
		} finally {
			//無異常則提交
			transactionManager.commitAndClose();
		}
	}
}
這是做上一個專案的時候用到的一個事務,功能是一張調撥單確認入庫時將資料從待入庫表刪除,加入已入庫表。
框架還沒學完也不知道Spring下的事務該怎麼寫,不過好歹會寫原生了。。。原理雖然是這麼個原理不過大概以後不會這麼寫吧,權當入門練習了。。

用到的TransactionManager類也貼一下:

package mjy.common.util.jdbc;

import java.sql.Connection;
import java.sql.SQLException;

/**
 * �������Ӷ�����ύ ���ع� ����������Ȳ���
 * @author igeek
 *
 */
public class TransactionManager {
	private Connection connection = null;
	
	public TransactionManager(Connection connection){
		this.connection=connection;
	}
	
	
	/**
	 * ��������
	 */
	public void startTransaction(){
		try {
			connection.setAutoCommit(false);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	/**
	 * �ύ����
	 */
	public void commitAndClose(){
		
		try {
			connection.commit();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
			JdbcUtil.free(connection);
		}
		
	}
	
	/**
	 * �ع�����
	 */
	public void rollbackAndClose(){
		try {
			connection.rollback();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
			JdbcUtil.free(connection);
		}
		
	}
	
}

其他組寫的工具類編碼用的gbk轉utf-8的亂碼,註釋都能猜得出來就不改了。

相關推薦

JDBC資料庫事務

之前因為教師斷了一次網,然後又開始學前端,和js做了一個多月的鬥爭,回過神要講Spring了才發現部落格已經冷了很久了。。。慢慢補上吧 今天先把資料庫事務的一個案例記一下,也是前幾個星期剛剛才會寫的。。 package mjy.kuguan.ruku.dao.impl;

Laravel資料庫事務

最近公司專案集成了一個支付的模組。由於網路世界是不確定的。說不定哪個操作就出了問題。為了保證資料的正確性我們不得不考慮使用資料庫事務這一特性。本文做一個Laravel資料庫事務的介紹。 知識回顧 一 、事務將一堆的資料庫操作組合到一個工作單元中執行 二 、事務的

JDBC實現JDBC實現銀行的轉賬事務

str package b- exceptio hide use play key rgs JDBC中的事務是默認提交的,也就是說每執行一次PreparedStatement,那麽數據就會被寫入到磁盤。如果需要關閉默認提交,使用 void setAutoCommit(fa

DB2資料庫事務日誌已滿。SQLSTATE=57011

問題描述 在使用資料庫的時候報錯如上圖,我們先使用db2 get db cfg for sample檢視相關配置引數,其中sample為資料庫名稱 C:\Users\Thinkpad>db2 get db cfg for sample    

事務資料庫事務

        我跟事務可能結了很久的仇,總是因為它被同事們各種笑話,我也甚是慚愧hahahahaha~,今兒閒了來整理一下 一、事務模型 1. 自動事務:在事務中,事務自動提交,發生錯誤時自動回滾

轉載MySQL事務以及SELECT ... FOR UPDATE的使用

商品 tail ase -a base 我們 evel erl tel MySQL中的事務,默認是自動提交的,即autocommit = 1; 但是這樣的話,在某些情形中就會出現問題:比如: 如果你想一次性插入了1000條數據,mysql會commit1000次的, 如果我

JDBC一、JDBC連接數據庫

connect cti close 一個數據庫 odin forname pass lock catch 1 package com.jdbc; 2 3 import java.sql.Connection; 4 import java.sql.DriverMa

資料庫一對一、一對多、多對多關係

轉自:https://blog.csdn.net/u013144287/article/details/79024130  本來資料庫一對一、一對多、多對多關係並不複雜,但是最近在理解的時候感覺又感覺多了寫新意,所以現在在來總結一下吧 一、首先給出三種關係的例項 1、一對一關係例項 &

資料庫介紹(MySQL安裝 體系結構、基本管理)

【轉】資料庫介紹(MySQL安裝 體系結構、基本管理) 第1章 資料庫介紹及mysql安裝   1.1 資料庫簡介   資料庫,簡而言之可視為電子化的檔案櫃——儲存電子檔案的處所,使用者可以對檔案中的資料執行新增、擷取、更新、刪除等操作。   所謂“資料庫”系以一定方式儲存在一起、能予多個

leetcode資料庫練習三

 【練習一】Write a query to print the sum of all total investment values in 2016 (TIV_2016), to a scale of 2 decimal places, for all policy holders

分散式事務之TCC服務設計和實現注意事項

1、TCC簡介 TCC是一種比較成熟的分散式事務解決方案,可用於解決跨庫操作的資料一致性問題; TCC是服務化的兩階段程式設計模型,其Try、Confirm、Cancel 3個方法均由業務編碼實現; 其中Try操作作為一階段,負責資源的檢查和預留,Confirm操作作為二階段提交操作,執行真正的業務,C

溫故知新分散式事務及分散式鎖系列文章總結石杉的架構筆記

歡迎關注個人公眾號:石杉的架構筆記(ID:shishan100) 週一至週五早8點半!精品技術文章準時送上! “ 這周我們來小結一下分散式系列的文章,包含分散式事務及分散式鎖,無論是工作還是面試,都是非常重要的一塊知識點。 一 通過一個真實的電商業務場景驅動,我們介紹了什麼是TCC分散式事務、如何

mysql資料庫隔離級別read committed && MVCC

前言 可以很負責任的跟大家說,MySQL 中的此隔離級別不單單是通過加鎖實現的,實際上還有repeatable read 隔離級別,其實這兩個隔離級別效果的實現還需要一個輔助,這個輔助就是MVCC-多版本併發控制,但其實它又不是嚴格意義上的多版本併發控制,是不是很懵,沒關

LeetCode資料庫

【題目描述】 Employee 表包含所有員工資訊,每個員工有其對應的 Id, salary 和 department Id。 +----+-------+--------+--------------+ | Id | Name | Salary | Departmen

nodeJS連線MySql資料庫

準備資料庫:redmine 工程結構: config .js var config = { database: 'redmine', // 使用哪個資料庫 username: 'redmine', // 使用者名稱 password:

學習資料庫學習 -- 索引的原理

一、索引的基礎認知 索引可以加快資料庫的檢索速度 表常進行增(insert)刪(delete)改(update)操作,不建議建立索引,因為索引會降低增刪改等維護操作的速度 索引佔用物理空間和資料空間 索引具有最左匹配原則 索引分為:聚集索引和非聚集索引 Mysql

MyBatis資料庫的一對多查詢:關於resultMap的使用

利用resultMap,能夠將查詢到的複雜資料(比如查詢到幾個表中資料)對映到一個結果集當中。 (1)如下圖所示,在進行一對多查詢時: (2)通常要求不能出現重複記錄,因此需要對結果資料可以進行整合 (3)解決方案:利用resultMap。程式碼如下: i

Mycat資料庫效能提升利器(三)——Mycat實現Mysql主從複製和讀寫分離

一、前言       在前一篇文章中,小編向大家 介紹了使用Mycat水平切分資料庫。可以說,使用了水平分庫後,資料庫提升還是很高的。如果想更高的提高資料庫效能,就可以考慮對Mysql進行主從複製和讀寫分離了。       在這篇部落格中,小編就向大家介紹基於Mycat的M

mysql 資料庫字符集和排序規則

庫的字符集影響表和欄位的字符集 資料庫字符集 》表的字符集 》 欄位的字符集 (從前往後優先順序由低到高,從左往右繼承,如果表沒設定字符集,繼承資料庫的,如果欄位沒設定,繼承表的) 資料庫的字符集如果是utf8,表和欄位的字符集繼承 欄位的字符集和排序規則繼承自表,例如表的字符集為

原創資料庫中為什麼不推薦使用外來鍵約束

引言 其實這個話題是老生常談,很多人在工作中確實也不會使用外來鍵。包括在阿里的JAVA規範中也有下面這一條 【強制】不得使用外來鍵與級聯,一切外來鍵概念必須在應用層解決。 但是呢,詢問他們原因,大多是這麼回答的 每次做DELETE 或者UPDATE都必須考慮外來鍵約束,會導致開發的時候很痛苦,測試資料