黑马day11 事务入门案例

事务:事务是逻辑上的一组操作,这组操作要么同时执行要么同时不完成

事务的管理:默认情况下,数据库会自动管理事务,管理的方式是一条语句就独占一个事务。

如果需要自己控制事务也可以通过如下命令开启/提交/回滚事务

start transaction

commit

rollback

jdbc的事务管理:

conn.setAutoCommit(false)//设置自己开启事务

conn.commit()//提交事务

conn.rollback()//回滚事务

SavePoint sp=con.setSavePoint()//设置回滚点

conn.rollback(sp)//回滚到指定的回滚点

案例:

数据库:

mysql> create table account(
    -> id int primary key anto_increment,
    -> name varchar(20),
    -> money double
);

查看数据库:

mysql> select * from account;
+----+------+-------+
| id | name | money |
+----+------+-------+
|  1 | a    |   100 |
|  2 | b    |   100 |
+----+------+-------+

TransationDemo:

package cn.itheima.transation;

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

import cn.itheima.utils.JDBCUtils;
public class TransationDemo1 {
	public static void main(String[] args) {
		Connection con=null;
		PreparedStatement ps=null;
		ResultSet rs=null;
		Savepoint save=null;
		try {
			con=JDBCUtils.getConnection();
			//数据库默认的是一个sql语句是一个事务,即执行一个sql语句就自动提交了,我们需要更改数据库的默认设置为false
			con.setAutoCommit(false);
			ps=con.prepareStatement("update  account set money=money-10 where name=?");
			ps.setString(1, "a");
			ps.executeUpdate();
			ps=con.prepareStatement("update account set money= money+10 where name=?");
			ps.setString(1, "b");
			ps.executeUpdate();

			//设置一个回滚点,
			save=con.setSavepoint();
			ps=con.prepareStatement("update  account set money=money-10 where name=?");
			ps.setString(1, "a");
			ps.executeUpdate();
			ps=con.prepareStatement("update account set money= money+10 where name=?");
			ps.setString(1, "b");
			ps.executeUpdate();
			int i=1/0;
			//提交事务,从开启一个事务到提交一个事务这是一个事务,这些sql语句就在一个事务中
			con.commit();
		} catch (Exception e) {
			e.printStackTrace();
			//如果抛出异常了,我也提交事务
			try {
				if(save==null){//说明没有执行到回滚点就抛出了异常
					con.rollback();
				}else{//不为null,就回滚到设置的回滚点
					con.rollback(save);
					con.commit();
				}
			} catch (SQLException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
		}finally{
			JDBCUtils.closeResource(rs, ps, con);
		}
	}
}

再查数据库:

我们发现

mysql> select * from account;

+----+------+-------+

| id | name | money |

+----+------+-------+

|  1 | a    |    90 |

|  2 | b    |   110 |

+----+------+-------+

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-17 07:22:55

黑马day11 事务入门案例的相关文章

黑马day11 事务的四大特性

1.事务的四大特性:一个事务具有的最基本的特性,一个设计良好的数据库可以为我们保证这四大特性. 1.1原子性:原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生要么都不发生. 1.2一致性:如果事务执行之前数据库是一个完整性的状态,那么事务结束后,无论事务是否执行成功,数据库仍然是一个完整性状态. 数据库的完整性状态:当一个数据库中的所有的数据都符合数据库中所定义的所有的约束,此时可以称数据库是一个完整性状态. 1.3隔离性:事务的隔离性是指多个用户并发访问数据库时,一个用户的事务不

黑马day17 ajax入门案例

如何实现Ajax异步交互: *实现Ajax的步骤: (1).创建XMLHttpRequest对象 固定写法,不用记...如果面试问到,所以最好是背诵下来 (2).注册监听 利用XMLHttpRequest对象的onreadystatechange属性:用来监听属性的状态 利用XMLHttpRequest对象的readyState属性:获取服务器端的状态 利用XMLHttpRequest对象的status属性:获取状态码(200,404等) (3).建立连接 利用XMLHttpRequest对象的

Hibernate介绍和入门案例

一身转战三千里,一剑曾当百万师 如果你在之前没有学过SSH三大框架,那么你之前肯定是通过JDBC来对数据库进行操作.现在,你完全可以把跟数据库交互的操作直接交给Hibernate. Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的 orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库. Hibernate可以应用在任何使用JDBC

一起学习Hibernate: Hibernate01 —— Hibernate的概述与入门案例

一 Hibernate的介绍 1 让我们从JDBC与替代它的框架Hibernate进行一下对比. 1.1 JDBC的缺点 1) 代码结构繁琐.每次书写sql语句操作数据库都得需要很多步; 2) 是面向过程的编程,而非面向对象的: 3) 没有做到数据缓存.这会导致程序与数据库的交互的次数很多: 4) 因为事务是自动开启的,所以存在安全隐患. 1.2 JDBC的优点 1) 因为是底层的数据库操作,所以执行效率很高: 2) sql语句可以自己编写,可以进行优化从而选择效率最高的那些. 1.3 Hibe

MyBatis学习(一)简介及入门案例

1.什么是MyBatis? MyBatis是一个支持普通SQL查询,存储过程,和高级映射的优秀持久层框架.MyBatis去掉了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可以使用简单的XML或注解进行配置和原始映射,以将接口和Java的POJO映射成数据库中的记录. MyBatis作为持久层框架,主要思想是将程序中大量的SQL语句剥离出来,配置在配置文件中,以实现SQL的灵活配置.这样的好处是将SQL语句和程序代码分离,可以在不修改代码的前提下,直接在配置文件中修

MyBatis入门案例、增删改查

1.MyBatis是什么?(下载地址:https://github.com/mybatis/mybatis-3/releases) MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis,实质上Mybatis对ibatis进行一些改进. MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,而不需要花费

Hibernate入门案例及增删改查

一.Hibernate入门案例剖析: ①创建实体类Student 并重写toString方法 public class Student { private Integer sid; private Integer age; private String name; public Integer getSid() { return sid; } public void setSid(Integer sid) { this.sid = sid; } public Integer getAge() {

Hibernate入门案例

1.Hibernate框架简述 Hibernate的核心组件在基于MVC设计模式的JAVA WEB应用中,Hibernate可以作为模型层/数据访问层.它通过配置文件(hibernate.properties或hibernate.cfg.xml)和映射文件(***.hbm.xml)把JAVA对象或PO(Persistent Object,持久化对象)映射到数据库中的数据库,然后通过操作PO,对数据表中的数据进行增,删,改,查等操作.除配置文件,映射文件和持久化类外,Hibernate的核心组件包

Hibernate入门案例 增删改

一.Hibernate入门案例剖析: ①创建实体类Student 并重写toString方法 public class Student { private Integer sid; private Integer age; private String name; public Integer getSid() { return sid; } public void setSid(Integer sid) { this.sid = sid; } public Integer getAge() {