简介
- 概述: 将多条SQL语句, 看作一个整体. 要么一起成功, 要么一起失败,事务在mysql中, 是默认自动提交的 .
操作
- 开启事务: start transaction;
- 回滚 : rollback; --此次事务中所有的sql操作, 放弃.
- 提交 : commit; --此次事务中所有的sql操作, 作为一个整体, 提交.
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 级别字符串;
(了解)