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元,然而,银行账户上的钱没变化,那就糟糕了。

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 最简单的ajax例子

    最简单的ajax例子自从JesseJamesGarrett创造了AJAX这个名词,到现在已经过去十八个月了,AJAX几乎让Web开发彻底改头换面。在这一年半的时间里,发生了很多事情,包括Web2.0的热炒,许多创建或使用富互联网技术公司的诞生或复苏,还有真正动态化的在线软件层出不穷。很明显,AJAX这个名词受到开发业界的广欢迎,已经真正的走入到我们生活中,Web应用程序也达到前所未有的发展。  如此火爆的

  • IE主页被https://hao.360.cn/?a1004劫持,如何解决

    IE主页被https://hao.360.cn/?a1004劫持,如何解决最近IE主页被https://hao.360.cn/?a1004劫持了,不管如何杀毒,更换主页地址,都是不行,包括306、火绒等工具,它就是那么的顽强,不让你更改。但是发现一个现象,那就是如果你在C:\ProgramFiles(x86)\InternetExplorer里找到iexplore.exe,直接打开,会跳转到自己设置的主页,如果你把ie“固定到开始屏幕”,然后在开始屏幕里打开,还是被劫持,那如何解决呢?解决方案:1、IE的主页里先设置自己需要的地址;2、卸载360安全卫士;

  • WIN10安装64位JDK10.0.2详细完整教程(图文)

    WIN10安装64位JDK10.0.2详细完整教程(图文)1.下载JDK下载地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html1)如下图,点击红色箭头处:2)如下图

  • SQL分页的三种方法[通俗易懂]

    SQL分页的三种方法[通俗易懂]三种SQL分页法  表中主键必须为标识列,[ID]intIDENTITY(1,1) 1.分页方案一:(利用NotIn和SELECTTOP分页)语句形式: SELECTTOP10*FROMTestTableWHERE(IDNOTIN     (SELECTTOP20id     FROMTestTable     ORDERBY

  • MCU_STM32的位带操作 — bit banding[通俗易懂]

    MCU_STM32的位带操作 — bit banding[通俗易懂]位带操作STM32芯片除了通用的寄存器访问,还有一个比较有意思的位带操作。这个位带的意思,就是每个比特(bit)位膨胀成一个32位的字(word),当访问这些字的时候就达到了访问“位”的目的,这就是位带操作!位带操作一个典型的特点,就是把1个位映射到32位,在程序处理中方便操作具体位,典型的如RCC寄存器,需要逐位操作的地方比较多,直接寄存器操作的话,程序的可读性不强;位带操作的缺…

    2022年10月12日

发表回复

您的电子邮箱地址不会被公开。

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