1. 程式人生 > >JDBC 實現 事務管理

JDBC 實現 事務管理

為了實現資料庫資料的安全性,資料庫有了事務管理機制。

事務管理具有

原子性 —— 具有相互關聯的一系列操作,要麼一次全部執行成功,要麼執行失敗,資料回滾;

一致性 —— 資料庫在事務執行前後,資料庫都應處於相同的狀態;

永續性 —— 一旦事務提交,事務對於資料庫的變更是持久的;

隔離性 —— 同一資料庫各個事務之間獨立執行,並不互相串擾。

現使用如下程式碼實現對資料庫的事務的表述,通過前後事務執行過程中的衝突,表現事務的原子性。

create table tbl_user(
id int(11) unsigned not null auto_increment,
name varchar(50) not null default '',
password varchar(50) not null default '',
email varchar(50) default '',
primary key (id))
engine = InnoDB
default charset = utf8;

create table tbl_address(
id int(11) unsigned not null auto_increment,
city varchar(20) default null,
country varchar(20) default null,
user_id int(11) unsigned not null,
primary key(id))
engine = innodb
default charset = utf8;

insert into tbl_user(id,name,password,email) values
(1,'xiaoming','123456','
[email protected]
'), (2,'xiangzhang','123456','[email protected]'); insert into tbl_address (city,country,user_id) values ('beijing','china',1); insert into tbl_address (city,country,user_id) values ('tianjin','china',2);

對資料庫進行兩次操作,第一次操作成功實現,第二次操作,資料庫中原有的資料與插入資料出現主鍵衝突時,程式報錯,假設兩次操作是相互關聯的操作,出於資料庫事務的原子性考慮,現採用資料回滾解決報錯。程式碼示例如下。
package jdbc_Pack_005;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;

public class JDBC_Cls_005 {

	public static Connection getConnection(){
		Connection connection = null;
		try{
			Class.forName("com.mysql.jdbc.Driver");
			connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/jsp_db","root","1233211234567");
			}
		catch(Exception e){
			e.printStackTrace();
		}
		return connection;
	} 
	
	public static void insertUserData(){
		Connection connection = getConnection();
		try {
			String sql = "INSERT INTO tbl_user(id,name,password,email)"
					+ "VALUES(10,'Tom','123456','
[email protected]
')"; Statement statement = (Statement) connection.createStatement(); int count = statement.executeUpdate(sql); System.out.println("向用戶表中插入了"+count+"條記錄 !"); connection.close(); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } } public static void insertAddrData(){ Connection connection = getConnection(); try { String sql = "INSERT INTO tbl_address(id,city,country,user_id)" + "VALUES(1,'shanghai','china','10')"; Statement statement = (Statement) connection.createStatement(); int count = statement.executeUpdate(sql); System.out.println("向地址表中插入了"+count+"條記錄 !"); connection.close(); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } } public static void main(String []args) { insertUserData(); insertAddrData(); } }

package jdbc_Pack_005;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;

public class JDBC_Cls_006 {

	public static Connection getConnection(){
		Connection connection = null;
		try{
			Class.forName("com.mysql.jdbc.Driver");
			connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/jsp_db","root","1233211234567");
			}
		catch(Exception e){
			e.printStackTrace();
		}
		return connection;
	} 
	
	public static void insertUserData(Connection connection)throws Exception{
		String sql = "INSERT INTO tbl_user(id,name,password,email)"
				+ "VALUES(10,'Tom','123456','[email protected]')";
		Statement statement = (Statement) connection.createStatement();
		int count = statement.executeUpdate(sql);
		System.out.println("向用戶表中插入了"+count+"條記錄 !");
	}
 

	public static void insertAddrData(Connection connection)throws Exception{
		String sql = "INSERT INTO tbl_address(id,city,country,user_id)"
				+ "VALUES(1,'shanghai','china','10')";
		Statement statement = (Statement) connection.createStatement();
		int count = statement.executeUpdate(sql);
		System.out.println("向地址表中插入了"+count+"條記錄 !");
	}
	
	public static void main(String []args) {
		Connection connection = null;
		try {
			connection = getConnection();
			connection.setAutoCommit(false);
			
			insertUserData(connection);
			insertAddrData(connection);	
			
			connection.commit();
		} catch (Exception e1) {
			// TODO: handle exception
			System.out.println("=========== 捕獲到SQL異常 ===========");
			e1.printStackTrace();
			try {
				connection.rollback();
				System.out.println("=========== 事務回滾成功 ===========");
			} catch (Exception e2) {
				e2.printStackTrace();
			}
		}finally{
			try{
				if(connection != null){
					connection.close();
				}
			}catch(Exception e3){
				e3.printStackTrace();
			}
		}
	}
}


配置檔案報錯

Tue Aug 02 17:00:34 CST 2016 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
解決方案,配置檔案修改為
driver = com.mysql.jdbc.Driver
dburl = jdbc\:mysql\://localhost\:3306/jsp_db?characterEncoding=utf8&useSSL=false
user = root
password = 1233211234567


相關推薦

JDBC 實現 事務管理

為了實現資料庫資料的安全性,資料庫有了事務管理機制。 事務管理具有 原子性 —— 具有相互關聯的一系列操作,要麼一次全部執行成功,要麼執行失敗,資料回滾; 一致性 —— 資料庫在事務執行前後,資料庫都應處於相同的狀態; 永續性 —— 一旦事務提交,事務對於資料庫的變更是持久

jdbc實現事物管理

jdbc 事物 本文實現舊庫中的數據搬到新庫中1、獲取jdbc連接package com.transferdata; import java.sql.DriverManager; import java.sql.SQLException; import com.mysql.jdbc.Connect

Mybatis整合Spring實現事務管理的源碼分析

utils tab cti oca def bean ssi connect ger 一:前言   沒有完整看完,但是看到了一些關鍵的地方,這裏做個記錄,過程會有點亂,以後逐漸補充最終歸檔為完整流程;相信看過框架源碼的都知道過程中無法完全確定是怎樣的流程,畢竟不可能全部都

springMVC實現事務管理

i++ list @override TP pri code time IT exc 我們都知道spring可以實現事務管理,但是如何實現? 經過查看:知道了,如果想要實現事務,必須要在@transactional標簽下拋出一個新的異常,spring才可以監聽到這個錯誤,然

Spring-jdbc事務管理器的使用

事務的概念 首先要明確一下事務的概念: 事務是一系列的動作,它們被當做一個單獨的工作單元。這些動作要麼全部完成要麼全部不起作用。 事務管理是企業級應用程式開發中必不可少的技術, 用來確保資料的完整性和一致性。 事務有四個關鍵屬性: 1、原子性(atomicity):事務是一

SSM框架——以註解形式實現事務管理

           上一篇博文《SSM三大框架整合詳細教程》詳細說了如何整合Spring、SpringMVC和MyBatis這三大框架。但是沒有說到如何配置mybatis的事務管理,實現開發中,事務

使用動態代理實現事務管理

最近在寫一個簡單的web框架,使用動態代理和ThreadLocal實現的事務管理,在這裡和大家分享一下。 關於動態代理有jdk動態代理和cglib動態代理,這裡選用了cglib。 DbHelper類提供資料庫的一些操作。 package com.me.coin.fram

SSM框架中以註解形式實現事務管理

如何整合Spring、SpringMVC和MyBatis這三大框架。但是沒有說到如何配置mybatis的事務管理,實現開發中,事務是必不可少的。本篇作為對上一篇的補充,說明在SSM框架中如何使用註解的形式進行事務管理。 什麼是事務? 在編寫業務的過程中,會需要進行事務處理

宣告式事務管理通過註解配置和如何通過面向切面技術實現事務管理

第一種  註解的方式實現宣告式事務管理 <!-- 定義事務管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransac

xml方式實現spring的宣告式事務管理及對jdbc操作的支援

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"     xmlns:xsi="http://www.w3.org/2001/XMLSchema-

Spring事務管理JDBC實現

Spring事務管理的實現有許多細節,如果對整個介面框架有個大體瞭解會非常有利於我們理解事務,下面通過Spring的事務介面來了解Spring實現事務的具體策略。  Spring事務管理涉及的介面的聯絡如下: Spring宣告式事務管理器類:          

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

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

JDBC事務管理及SavePoint示例

自動提交 檢查點 使用 服務 gda llb imp 事務 特殊 JDBC API提供了setAutoCommit()方法,通過它我們可以禁用自動提交數據庫連接。自動提交應該被禁用,因為只有這樣事務才不會自動提交,除非調用了連接的commit()方法。數據庫服務器使用表鎖

Spring JDBC-混合框架的事務管理

組合 manager 延遲 發生 required 應用 conf 一個 研究 ? Spring 抽象的 DAO 體系兼容多種數據訪問技術,它們各有特色,各有千秋。 Hibernate 是非常優秀的 ORM 實現方案,但對底層 SQL 的控制不太方便 M

事務的學習,從jdbc開始:jdbc事務的支持與實現

如何實現 ransac 阻止 事務隔離 完成後 value 事務提交 val ack   在使用spring對項目進行開發時,所有的事務都是由spring來管理的。這樣一來我們就可以不需要操心事務,可以專心的處理業務代碼。   但是,事務的底層究竟是如何實現的呢?那就從j

使用JOTM實現分布式事務管理(多數據源)

cnblogs content 分布式 npr ransac flow tis nproxy 定義 使用spring和hibernate可以很方便的實現一個數據源的事務管理,但是如果需要同時對多個數據源進行事務控制,並且不想使

Spring---AOP註解開發&jdbc模板&Spring事務管理

use oca update -m spl pub tex com att 一、AOP註解開發   此處需要回憶一遍AOP的概念。簡單的來說,AOP就是利用動態代理技術,做到不觸動源代碼但卻擴展了功能。那麽就需要一個被擴展的對象和一個“新的功能”,例如說給某類的saveUs

【Spring】—AOP之AspectJ註解方式實現聲明式事務管理

source xml配置 blog org 僅支持 選擇 imp 獨立 col 前言 這回來說下註解方式的聲明式事務管理。 正文 Demo 1、引入相關的jar包這裏寫圖片描述 2、引入AOP約束<beans xmlns:xsi="http://www.w3

Java框架-Spring的jdbc、連線池及事務管理

1. Spring的AOP程式設計 1.1 純xml程式設計 <!--通知配置型別--> <aop:config> <!--設定切面--> <aop:aspect ref="logger"> <!-

深入理解spring的事務管理機制及程式碼實現

Spring的事務管理機制 Spring事務管理高層抽象主要包括3個介面,Spring的事務主要是由他們共同完成的: PlatformTransactionManager:事務管理器—主要用於平臺相關事務的管理 TransactionDefinition: 事務定義資訊(隔