您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關MySQL和JDBC事務控制的示例分析,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
一、MySQL的事務控制(Transaction Control Language)
(1)事務的特性(ACID)
事務指的是邏輯上的一組操作,組成這組操作的邏輯單元要么一起成功,要么一起失敗。
原子性(atomicity):強調事務不可分割。
一致性(consistency):強調的是事務的執行的前后,數據的完整性要保持一直。
隔離性(isolation):一個事務的執行不應該受到其他事務的干擾。
持久性(durability):事務一旦結束(提交/回滾)數據就持久保持到了數據庫。
(2)MySQL的事務控制
設置手動提交:set autocommit = false;
回滾rollback;
提交commit ;
(3)mysql事務演示
☆查看已經存在的emp表:
mysql> select * from emp;+-------+--------+--------+------+------------+----------+--------+--------+| empno | ename | job | mgr | hiredate | sal | commit | deptno |+-------+--------+--------+------+------------+----------+--------+--------+| 1002 | 白展堂 | clerk | 1001 | 1983-05-09 | 7000.00 | 200.00 | 10 || 1003 | 李大嘴 | clerk | 1002 | 1980-07-08 | 8000.00 | 100.00 | 10 || 1004 | 呂秀才 | clerk | 1002 | 1985-11-12 | 4000.00 | NULL | 10 || 1005 | 郭芙蓉 | clerk | 1002 | 1985-03-04 | 4000.00 | NULL | 10 || 1007 | 小白 | clerk | 1001 | 2019-11-25 | 5555.00 | 500.00 | NULL || 2001 | 胡一菲 | leader | NULL | 1994-03-04 | 15000.00 | NULL | 20 || 2002 | 陳美嘉 | manger | 2001 | 1993-05-24 | 10000.00 | 300.00 | 20 || 2003 | 呂子喬 | clerk | 2002 | 1995-05-19 | 7300.00 | 100.00 | 20 || 2004 | 張偉 | clerk | 2002 | 1994-10-12 | 8000.00 | 500.00 | 20 || 2005 | 曾小賢 | clerk | 2002 | 1993-05-10 | 9000.00 | 700.00 | 20 || 3001 | 劉梅 | leader | NULL | 1968-08-08 | 13000.00 | NULL | 30 || 3002 | 夏冬梅 | manger | 3001 | 1968-09-21 | 10000.00 | 600.00 | 30 || 3003 | 夏雪 | clerk | 3002 | 1989-09-21 | 8000.00 | 300.00 | 30 || 3004 | 張一山 | clerk | 3002 | 1991-06-16 | 8000.00 | 200.00 | 30 || 3007 | 嫦娥 | clerk | NULL | NULL | NULL | NULL | 10 |+-------+--------+--------+------+------------+----------+--------+--------+15 rows in set (0.00 sec)
①設置手動提交:
mysql> set autocommit=false;Query OK, 0 rows affected (0.03 sec)
②在emp表中插入一條ename為mary的語句:
mysql> insert into emp(ename,job,commit) -> values('mary','clerk',300);Query OK, 1 row affected (0.02 sec)mysql> select * from emp;+-------+--------+--------+------+------------+----------+--------+--------+| empno | ename | job | mgr | hiredate | sal | commit | deptno |+-------+--------+--------+------+------------+----------+--------+--------+| 1002 | 白展堂 | clerk | 1001 | 1983-05-09 | 7000.00 | 200.00 | 10 || 1003 | 李大嘴 | clerk | 1002 | 1980-07-08 | 8000.00 | 100.00 | 10 || 1004 | 呂秀才 | clerk | 1002 | 1985-11-12 | 4000.00 | NULL | 10 || 1005 | 郭芙蓉 | clerk | 1002 | 1985-03-04 | 4000.00 | NULL | 10 || 1007 | 小白 | clerk | 1001 | 2019-11-25 | 5555.00 | 500.00 | NULL || 2001 | 胡一菲 | leader | NULL | 1994-03-04 | 15000.00 | NULL | 20 || 2002 | 陳美嘉 | manger | 2001 | 1993-05-24 | 10000.00 | 300.00 | 20 || 2003 | 呂子喬 | clerk | 2002 | 1995-05-19 | 7300.00 | 100.00 | 20 || 2004 | 張偉 | clerk | 2002 | 1994-10-12 | 8000.00 | 500.00 | 20 || 2005 | 曾小賢 | clerk | 2002 | 1993-05-10 | 9000.00 | 700.00 | 20 || 3001 | 劉梅 | leader | NULL | 1968-08-08 | 13000.00 | NULL | 30 || 3002 | 夏冬梅 | manger | 3001 | 1968-09-21 | 10000.00 | 600.00 | 30 || 3003 | 夏雪 | clerk | 3002 | 1989-09-21 | 8000.00 | 300.00 | 30 || 3004 | 張一山 | clerk | 3002 | 1991-06-16 | 8000.00 | 200.00 | 30 || 3007 | 嫦娥 | clerk | NULL | NULL | NULL | NULL | 10 || 4008 | mary | clerk | NULL | NULL | NULL | 300.00 | NULL |+-------+--------+--------+------+------------+----------+--------+--------+16 rows in set (0.00 sec)
③使用rollback
回滾
mysql> rollback;Query OK, 0 rows affected (0.00 sec)mysql> select * from emp;+-------+--------+--------+------+------------+----------+--------+--------+| empno | ename | job | mgr | hiredate | sal | commit | deptno |+-------+--------+--------+------+------------+----------+--------+--------+| 1002 | 白展堂 | clerk | 1001 | 1983-05-09 | 7000.00 | 200.00 | 10 || 1003 | 李大嘴 | clerk | 1002 | 1980-07-08 | 8000.00 | 100.00 | 10 || 1004 | 呂秀才 | clerk | 1002 | 1985-11-12 | 4000.00 | NULL | 10 || 1005 | 郭芙蓉 | clerk | 1002 | 1985-03-04 | 4000.00 | NULL | 10 || 1007 | 小白 | clerk | 1001 | 2019-11-25 | 5555.00 | 500.00 | NULL || 2001 | 胡一菲 | leader | NULL | 1994-03-04 | 15000.00 | NULL | 20 || 2002 | 陳美嘉 | manger | 2001 | 1993-05-24 | 10000.00 | 300.00 | 20 || 2003 | 呂子喬 | clerk | 2002 | 1995-05-19 | 7300.00 | 100.00 | 20 || 2004 | 張偉 | clerk | 2002 | 1994-10-12 | 8000.00 | 500.00 | 20 || 2005 | 曾小賢 | clerk | 2002 | 1993-05-10 | 9000.00 | 700.00 | 20 || 3001 | 劉梅 | leader | NULL | 1968-08-08 | 13000.00 | NULL | 30 || 3002 | 夏冬梅 | manger | 3001 | 1968-09-21 | 10000.00 | 600.00 | 30 || 3003 | 夏雪 | clerk | 3002 | 1989-09-21 | 8000.00 | 300.00 | 30 || 3004 | 張一山 | clerk | 3002 | 1991-06-16 | 8000.00 | 200.00 | 30 || 3007 | 嫦娥 | clerk | NULL | NULL | NULL | NULL | 10 |+-------+--------+--------+------+------------+----------+--------+--------+15 rows in set (0.00 sec)
發現mary沒有插入成功,因為手動提交后進行和回滾;如果使用commit進行提交就無法回滾成功,因為直接插入進數據庫中了。
二、JDBC的事務控制
(1)JDBC事務簡介
默認事務提交策略:一條命令自成一個完整事務。
需求:各個邏輯單元要么一起成功,要么一起失敗。(如轉賬)
(2)JDBC事務的API
conn.setAutoCommit(false);//將JDBC事務設置手動提交conn.commit();conn.rollback();
(3)JDBC事務控制模擬
在emp表中修改ename名為hellen的記錄,將其job從leader修改為clerk,獎金commit從600降低至300。
(模擬交易)TrasactionDemo:
package jdbc;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.SQLException;import util.JdbcUtil;/** * JDBC事務控制 * * @author Administrator * */public class TestTrasaction { public static void main(String[] args) { Connection conn = null; PreparedStatement pstm = null; PreparedStatement pstm1 = null; try { // 獲得連接 conn = JdbcUtil.getConnection(); //將JDBC事務設置手動提交 conn.setAutoCommit(false); // ①降職操作 String sql = "updata emp set job = 'clerk' where ename = 'hellen'"; pstm = conn.prepareStatement(sql); pstm.executeUpdate(); // ②降獎金操作 String sql1 = "updata emp set commit='3000' where ename = 'hellen'"; pstm1 = conn.prepareStatement(sql1); pstm1.executeUpdate(); //提交事務 conn.commit(); } catch (Exception e) { //事務回滾 try { conn.rollback(); } catch (SQLException e1) { e1.printStackTrace(); } } finally { try { JdbcUtil.release(null, pstm, null); JdbcUtil.release(null, pstm1, conn); } catch (Exception e) { e.printStackTrace(); } } }}
代碼中添加了JDBC事務來處理兩條sql語句(一條正確,一條錯誤),兩條sql語句都沒有執行。如果不添加JDBC事務處理,那么其中一條正確的sql語句就會單獨執行。
關于“MySQL和JDBC事務控制的示例分析”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。