MySQL和JDBC事务控制的示例分析

55次阅读
没有评论

共计 6088 个字符,预计需要花费 16 分钟才能阅读完成。

自动写代码机器人,免费开通

这篇文章将为大家详细讲解有关 MySQL 和 JDBC 事务控制的示例分析,丸趣 TV 小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

一、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。
MySQL 和 JDBC 事务控制的示例分析
(模拟交易)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();
 }}

MySQL 和 JDBC 事务控制的示例分析
代码中添加了 JDBC 事务来处理两条 sql 语句(一条正确, 一条错误),两条 sql 语句都没有执行。如果不添加 JDBC 事务处理,那么其中一条正确的 sql 语句就会单独执行。

关于“MySQL 和 JDBC 事务控制的示例分析”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

向 AI 问一下细节

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-12-04发表,共计6088字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)