Java之數據庫入門(事務)

SQL語句

  1. 數據定義語言DDL Data Definition Language):創建、修改或刪除數據庫中表、視圖、索引等對象的操作,常用命令爲create、alter和drop。
/*創建:
create database 數據庫名 [ character set 字符集 ] */
create database student character set utf8
/*創建表:*/
create table student(
	id char(12),
	name varchar(20),
	mobile char(11),
	address varchar(30)
)

/*刪除:
drop database 數據庫名稱*/
drop database student

/*修改:
alter database 數據庫名 character set 編碼*/
alter database student character set utf8
  1. 數據查詢語言DQL Data Query Language):按照指定的組合、條件表達式或排序檢索已存在的數據庫中數據,不改變數據庫中數據,常用命令爲select。
/*查詢:
select from student [where ='']*/
delete from student where id='001'

/*查看正在使用的數據庫 select database()*/
select database()

/*查看MySQL數據庫管理系統中所有數據庫:show databases*/
show database

/*查看某個數據庫的定義信息:show create database 數據庫名*/
show create database
  1. 數據操縱語言DML Data Manipulation Language):向表中添加、刪除、修改數據操作,常用命令有insert、update和delete。
/*刪除數據*/
delete from student where id='001'

/*修改數據*/
update student set name='Jim',mobile='13528375637' where id='002'

/*添加數據*/
insert into student (id,name,mobile,address) value('001','Jack','13526509597','henan')/*依次對應添加*/
insert into student value('002','Make','18703628548','zhengzhou')/*默認全部依次添加*/
  1. 數據控制語言DCL Data Control Language):用來授予或收回訪問數據庫的某種特權、控制數據操縱事務的發生時間及效果、對數據庫進行監視等操作,常用命令有GRANT、REVOKE、COMMIT、ROLLBACK。
rollback;
commit;

事務

事務四大特性(ACID):

  1. 原子性(Atomicity):化學中的原子指不可再分的基本微粒,數據庫中原子性強調事務是一個不可分割的整體,事務開始後所有操作要麼全部成功,要麼全部失敗,不可能停滯在中間某個環節。如果事務執行過程中出錯就會回滾到事務開始前的狀態,所有的操作就像沒有發生一樣不會對數據庫有任何影響。
  2. 一致性(Consistency):事務必須使數據庫從一個一致性狀態變換到另一個一致性狀態,即一個事務執行之前和執行之後都必須處於一致性狀態。拿轉賬來說,假設用戶A和用戶B兩者的錢加起來一共是5000,那麼不管A和B之間如何轉賬,轉幾次賬,事務結束後兩個用戶的錢相加起來應該還是5000,這就是事務的一致性。
  3. 隔離性(Isolation):當多個用戶併發訪問數據庫時,比如操作同一張表時,數據庫爲每一個用戶開啓的事務,不能被其他事務的操作所幹擾,多個併發事務之間要相互隔離,比如A正在從一張銀行卡中取錢,在A取錢的過程結束前,B不能向這張卡轉入錢。
  4. 持久性(Durability):一個事務一旦被提交,則對數據庫的所有更新將被保存到數據庫中,不能回滾。

完成一個事務:
(在轉賬時,轉出和轉入必須同時成功才能修改餘額數據,若有任意一個不成功,則不對數據庫內容進行修改)

通過Navicat Premium操作:

#創建一個用戶信息表
create table account(
  id char(36) primary key,
  card_id varchar(20) unique,
  name varchar(8) not null,
  money float(10,2) default 0
);

insert into account values('6ab71673-9502-44ba-8db0-7f625f17a67d','1234567890','張三',1000);
insert into account (id,card_id,name) values('9883a53d-9127-4a9a-bdcb-96cf87afe831','0987654321','張三');
select * from account

update account set money=money-100 where card_id='1234567890';
update account set money=money+100 where card_id='0987654321';
select * from account

update account set money=money-100 where card_id='1234567890';
update account set money=money+100 where card_d='0987654321';
select * from account

#默認:每一條sql語句都是一個獨立的事務,執行完單條sql語句後直接持久化到磁盤
set autocommit=0;#設置執行完一條sql語句後不再自動提交
update account set money=money-100 where card_id='1234567890';
update account set money=money+100 where card_d='0987654321';
commit;#手動提交
rollback;#手動回滾
select * from account

通過Java操作:

package com.jd.test;

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

public class Test {

	public boolean batch(String...sqls) {
		Connection connection = null;
		try {
			Class.forName("com.mysql.jdbc.Driver");//1、加載驅動
			String url = "jdbc:mysql://127.0.0.1:3306/test";
			connection = DriverManager.getConnection(url ,"root","root");//2、獲取連接
			connection.setAutoCommit(false);//3、關閉自動提交
			Statement statement = connection.createStatement();//4、創建sql語句
			for (String sql : sqls) {
				statement.addBatch(sql);
			}
			statement.executeBatch();//5、執行sql語句
			connection.commit();//6、手動提交
			return true;
		} catch (Exception e) {
			try {
				if (connection!=null) {
					connection.rollback();//7、若出現問題,則進行回滾
				}
			} catch (SQLException e1) {
				e1.printStackTrace();
			}
			e.printStackTrace();
		}
		return false;
	}
	
	public static void main(String[] args) {
		if(new Test().batch("update account set money=money-100 where card_id='1234567890'","update account set money=money+100 where card_id='0987654321'")) {
			System.out.println("Yes");
			return;
		}
		System.out.println("No");
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章