数据库-事务

简介

  • 概述: 将多条SQL语句, 看作一个整体. 要么一起成功, 要么一起失败,事务在mysql中, 是默认自动提交的 .

操作

  • 命令行
- 开启事务: start transaction;
- 回滚 : rollback; --此次事务中所有的sql操作, 放弃.
- 提交 : commit; --此次事务中所有的sql操作, 作为一个整体, 提交.
  • jdbc
JDBC事务通过连接对象开启, 回滚 ,提交. 只针对当前连接对象生效.
- 开启事务: conn.setAutoCommit(false);
- 回滚事务: conn.rollback();
- 提交事务: conn.commit();
  • 案例
package com.java.demo4;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

public class Main {

    public static void main(String[] args){
        Connection conn = null;
        Statement state = null;
        try{
            Class.forName("com.mysql.jdbc.Driver");
            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8","root","123");
            state = conn.createStatement();
			//事务不自动处理
            conn.setAutoCommit(false);
            state.executeUpdate("update xzk_user set account=50 where username='张三'");
            if(1==2){
                throw new RuntimeException("停电了");
            }
            state.executeUpdate("update xzk_user set account=150 where username='李四'");
            //提交任务
            conn.commit();
            //设置自动提交
            conn.setAutoCommit(true);
        }catch(Exception e){
            e.printStackTrace();
            try {
                conn.rollback();
            } catch (Exception throwables) {
                throwables.printStackTrace();
            }
        }finally {
            try {
                state.close();
            } catch (Exception throwables) {
                throwables.printStackTrace();
            }
            try {
                conn.close();
            } catch (Exception throwables) {
                throwables.printStackTrace();
            }
        }
    }
}

面试题

1. 请描述事务的四大特征 :
	<1>. 原子性: 事务是一个整体 , 不可分割 , 要么同时成功, 要么同时失败.
	<2>. 持久性: 当事务提交或回滚后, 数据库会持久化的保存数据.
	<3>. 隔离性: 多个事务之间, 隔离开, 相互独立.
	<4>. 一致性: 事务操作的前后 , 数据总量不变 (例如: 转账时: 孟亮给帅兵转账是一个事务, 转账完毕后. 两人余额的和不变.)
2. 请描述什么是脏读, 幻读, 不可重复读 ?
	- 脏读: 读取到了一个事务 未提交的数据.
	- 不可重复读: 一个事务中, 两次连续的读取 ,结果不一致(中间被其它事务更改了).
	- 幻读: 一个事务A在执行DML语句时, 另一个事务B也在执行DML语句 , B修改了A修改过的
	数据, 导致A在查询时就像发生了幻觉一样(A更改的内容A看不到了.)
3. 请描述事务的隔离级别
	//三种级别锁: 页级,表级,行级(共享锁,排它锁).
	1. 读未提交 : read uncommitted; (可能产生:脏读, 不可重复读, 幻读)
	2. 读已提交 : read committed; (可能产生: 不可重复度, 幻读)
	3. 可重复读 : repeatable read;(mysql默认值) (可能产生: 幻读)
4. 串行化 : serializable;
	- 查看数据库当前的隔离级别: select @@tx_isolation; (了解)
	- 数据库设置隔离级别: set global transaction isolation level 级别字符串;
	(了解)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值