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

一、MySQL的事务控制(Transaction Control Language)


(1)事务的特性(ACID)

事务指的是逻辑上的一组操作,组成这组操作的逻辑单元要么一起成功,要么一起失败。

原子性(atomicity):强调事务不可分割。

一致性(consistency):强调的是事务的执行的前后,数据的完整性要保持一直。

隔离性(isolation):一个事务的执行不应该受到其他事务的干扰。

持久性(durability):事务一旦结束(提交/回滚)数据就持久保持到了数据库。

(2)MySQL的事务控制

设置手动提交:set autocommit = false;

回滚rollback;

提交commit ;

(3)mysql事务演示

☆查看已经存在的emp表:

mysql>select*fromemp;+-------+--------+--------+------+------------+----------+--------+--------+|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|+-------+--------+--------+------+------------+----------+--------+--------+15rowsinset(0.00sec)

①设置手动提交:

mysql>setautocommit=false;QueryOK,0rowsaffected(0.03sec)

②在emp表中插入一条ename为mary的语句:

mysql>insertintoemp(ename,job,commit)->values('mary','clerk',300);QueryOK,1rowaffected(0.02sec)mysql>select*fromemp;+-------+--------+--------+------+------------+----------+--------+--------+|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|+-------+--------+--------+------+------------+----------+--------+--------+16rowsinset(0.00sec)

③使用rollback回滚

mysql>rollback;QueryOK,0rowsaffected(0.00sec)mysql>select*fromemp;+-------+--------+--------+------+------------+----------+--------+--------+|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|+-------+--------+--------+------+------------+----------+--------+--------+15rowsinset(0.00sec)

发现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:

packagejdbc;importjava.sql.Connection;importjava.sql.PreparedStatement;importjava.sql.SQLException;importutil.JdbcUtil;/***JDBC事务控制**@authorAdministrator**/publicclassTestTrasaction{publicstaticvoidmain(String[]args){Connectionconn=null;PreparedStatementpstm=null;PreparedStatementpstm1=null;try{//获得连接conn=JdbcUtil.getConnection();//将JDBC事务设置手动提交conn.setAutoCommit(false);//①降职操作Stringsql="updataempsetjob='clerk'whereename='hellen'";pstm=conn.prepareStatement(sql);pstm.executeUpdate();//②降奖金操作Stringsql1="updataempsetcommit='3000'whereename='hellen'";pstm1=conn.prepareStatement(sql1);pstm1.executeUpdate();//提交事务conn.commit();}catch(Exceptione){//事务回滚try{conn.rollback();}catch(SQLExceptione1){e1.printStackTrace();}}finally{try{JdbcUtil.release(null,pstm,null);JdbcUtil.release(null,pstm1,conn);}catch(Exceptione){e.printStackTrace();}}}}


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

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