jdbc 事务

jdbc 事务

目录

事务特性:

Mysql的TCL(Transaction Control Language)

Jdbc事务控制


事务特性:

  1. 原子性:强调事务的不可分割
  2. 一致性:强调的是事务执行的前后,数据的完整性要保持一致
  3. 隔离性:一个事务的执行不应该受到其他事务的干扰
  4. 持久性:事务一旦结束(提交/回滚)数据就持久保持到了数据库。

Mysql的TCL(Transaction Control Language)

  • set antocommit=false; 设置手动提交;
  • rollback 回滚;
  • commit 提交。

代码如下:

mysql> use mybase;
Database changed
mysql> desc test;
+----------+-------------+------+-----+---------+----------------+
| Field    | Type        | Null | Key | Default | Extra          |
+----------+-------------+------+-----+---------+----------------+
| empno    | int(11)     | NO   | PRI | NULL    | auto_increment |
| ename    | varchar(20) | YES  |     | NULL    |                |
| job      | varchar(20) | YES  |     | NULL    |                |
| mgr      | int(11)     | YES  |     | NULL    |                |
| hiredate | date        | YES  |     | NULL    |                |
| sal      | double(7,2) | YES  |     | NULL    |                |
| COMMIT   | double(7,2) | YES  |     | NULL    |                |
| deptno   | int(11)     | YES  | MUL | NULL    |                |
+----------+-------------+------+-----+---------+----------------+
8 rows in set (0.00 sec)

mysql> select * from test;
+-------+--------+--------+------+------------+----------+--------+--------+
| empno | ename  | job    | mgr  | hiredate   | sal      | COMMIT | deptno |
+-------+--------+--------+------+------------+----------+--------+--------+
|  1001 | 小白   | clerk  | 1001 | 2020-07-25 |  5000.00 | 200.00 |   NULL |
|  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 |
|  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 | 88000.00 | 200.00 |     30 |
+-------+--------+--------+------+------------+----------+--------+--------+
14 rows in set (0.00 sec)

mysql> insert into test (ename,job,commit) values('marry','clerk',300);
Query OK, 1 row affected (0.01 sec)

mysql> select * from test;
+-------+--------+--------+------+------------+----------+--------+--------+
| empno | ename  | job    | mgr  | hiredate   | sal      | COMMIT | deptno |
+-------+--------+--------+------+------------+----------+--------+--------+
|  1001 | 小白   | clerk  | 1001 | 2020-07-25 |  5000.00 | 200.00 |   NULL |
|  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 |
|  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 | 88000.00 | 200.00 |     30 |
|  3005 | marry  | clerk  | NULL | NULL       |     NULL | 300.00 |   NULL |
+-------+--------+--------+------+------------+----------+--------+--------+
15 rows in set (0.00 sec)

mysql> set autocommit = false;
Query OK, 0 rows affected (0.00 sec)

mysql> insert into helln test (ename,job,commit) values('marry','clerk',300);
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that
MySQL server version for the right syntax to use near 'test (ename,job,commit) v
',300)' at line 1
mysql> insert into test (ename,job,commit) values('helln','clerk',300);
Query OK, 1 row affected (0.00 sec)

mysql> select * from test;
+-------+--------+--------+------+------------+----------+--------+--------+
| empno | ename  | job    | mgr  | hiredate   | sal      | COMMIT | deptno |
+-------+--------+--------+------+------------+----------+--------+--------+
|  1001 | 小白   | clerk  | 1001 | 2020-07-25 |  5000.00 | 200.00 |   NULL |
|  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 |
|  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 | 88000.00 | 200.00 |     30 |
|  3005 | marry  | clerk  | NULL | NULL       |     NULL | 300.00 |   NULL |
|  3006 | helln  | clerk  | NULL | NULL       |     NULL | 300.00 |   NULL |
+-------+--------+--------+------+------------+----------+--------+--------+
16 rows in set (0.00 sec)

mysql> roollback;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that
MySQL server version for the right syntax to use near 'roollback' at line 1
mysql> rollback;
Query OK, 0 rows affected (0.01 sec)

mysql> select * from test;
+-------+--------+--------+------+------------+----------+--------+--------+
| empno | ename  | job    | mgr  | hiredate   | sal      | COMMIT | deptno |
+-------+--------+--------+------+------------+----------+--------+--------+
|  1001 | 小白   | clerk  | 1001 | 2020-07-25 |  5000.00 | 200.00 |   NULL |
|  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 |
|  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 | 88000.00 | 200.00 |     30 |
|  3005 | marry  | clerk  | NULL | NULL       |     NULL | 300.00 |   NULL |

温馨提示:编码格式为utf-8可能会出现乱码的情况,

解决办法之一:

打开mysql安装的地址,打开,my.ini. 并更改默认编码。查看汉字的话,建议用gBK

jdbc 事务jdbc 事务

 

 


 

Jdbc事务控制

默认事务提交策略:一条命令自成一个完整事务

需求:各个逻辑单元要么一起成功,要么一起失败(比如银行转账)

手动控制事务的API

conn.setAutoCommit(false);将jdbc的事务提交改为手动提交

conn.commit(); 

conn.rollback();

注意:连接提交策略一经设置,永久改变。

package jdbc;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

import util.jdbcUtil;

//jdbc控制事务
public class TestTrasaction {
	
	public static void main(String[] args) {
		Connection conn = null;
		PreparedStatement pstm1 = null;
		PreparedStatement pstm2 = null;
		//获得连接
		try {
			conn = jdbcUtil.getConnection();
			//将jdbc事务设置成手动提交
			conn.setAutoCommit(false);
			//降职操作
			String sql1 = "update test set job ='clerk' where ename='刘梅'";
			pstm1 = conn.prepareStatement(sql1);//创建对象
			pstm1.executeUpdate();//处理数据
		
			//降奖金操作
			String sql2 = "update test set commit=100 where ename = '刘梅'";
			pstm2 = conn.prepareStatement(sql2);
			pstm2.executeUpdate();
			//提交事务
			conn.commit();
			
		} catch (Exception e) {
		
			try {
				conn.rollback();
			} catch (SQLException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
		}finally{
			try {
				jdbcUtil.release(null, pstm1, null);//先关闭pstm1
				jdbcUtil.release(null, pstm2, conn);//在关闭pstm2,conn
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
}

手动提交,好处就是可以回滚,然后,如果不一致,就无法进行操作,适用于银行转账等特定的操作。

不然你花了一w元,然而,银行账户上的钱没变化,那就糟糕了。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/114781.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • Dubbo 负载均衡策略和集群容错策略都有哪些?动态代理策略呢?

    Dubbo 负载均衡策略和集群容错策略都有哪些?动态代理策略呢?面试题dubbo负载均衡策略和集群容错策略都有哪些?动态代理策略呢?面试官心理分析继续深问吧,这些都是用dubbo必须知道的一些东西,你得知道基本原理,知道序列化是什么协议,还得知道具体用dubbo的时候,如何负载均衡,如何高可用,如何动态代理。说白了,就是看你对dubbo熟悉不熟悉:dubbo工作原理:服务注册、注册中心、消费者、代理通信、负载均衡; 网络通…

    2022年7月11日
  • Windows Mobile 6.0 SDK和中文模拟器下载

    Windows Mobile 6.0 SDK和中文模拟器下载

    2021年11月29日
  • IntelliJ IDEA创建Servlet最新方法 Idea版本2020.2.2以及IntelliJ IDEA创建Servlet 404问题(超详细)

    IntelliJ IDEA创建Servlet最新方法 Idea版本2020.2.2以及IntelliJ IDEA创建Servlet 404问题(超详细)第一次用IntelliJIDEA写java代码,之前都是用eclipse,但eclipse太老了。下面为兄弟们奉上IntelliJIDEA创建Servlet方法,写这个的目的也是因为在网上找了很多资料但都过时了,所以把我走过的坑和弯路直接告诉兄弟们,为大家节省点宝贵的时间。说一下现在创建Servlet或者是web和之前的主要区别,之前是直接创建,现在是先要创建java项目然后通过添加支持框架变成Servlet或者web项目下面这些截图最好都看完,因为有的地方有坑,都在后面的截图里。我用

    2022年6月17日
  • 五大常用算法之分支定界法

    五大常用算法之分支定界法看了五大常用算法之一这篇博文,感觉理解了很多,可是纯粹都是理论,缺少一些示例,所以准备综合一篇博文,以帮助自己记忆,原文:一、基本描述   类似于回溯法,也是一种在问题的解空间树T上搜索问题解的算法。但在一般情况下,分支限界法与回溯法的求解目标不同。回溯法的求解目标是找出T中满足约束条件的所有解,而分支限界法的求解目标则是找出满足约束条件的一个解,或是在满足约束条件的解中

    2022年10月31日
  • CAD拉伸的快捷命令_cad拉伸实体快捷键

    CAD拉伸的快捷命令_cad拉伸实体快捷键CAD快捷键在CAD绘图中是不可或缺的,刚入门CAD的小伙伴们一定要熟练掌握常用CAD快捷键命令的使用。那么CAD拉伸快捷键命令是什么呢?又该如何使用呢?下面小编就来给大家介绍一下浩辰CAD软件中CA

    2022年8月4日
  • 客服系统源码购买_网联接入商户扣款

    客服系统源码购买_网联接入商户扣款介绍:客服系统多种商户接入客服源码,可以实现一行代码接入客服,非常舒服,支持无限客服,无限坐席!私有化源码部署,数据可控,稳定可靠。可自定义版权、logo。支持网页、微信公众号、小程序、App等任何程序对接。客服数量不限,每个客服又独立管理后台和账户密码。每个账户管理可以添加N个客服并且可以分组。双向微信模板消息通知。支持商品推送,对客服评价。支持客户分组。支持设置问候语,进入对话自动发送消息,可只能分配客服和转接。网盘下载地址:http://kekewl.cc/Evr7Jd0UX7h图

    2022年9月21日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号