事务

一、事务(Transaction)

Transaction 其实指的一组操作,里面包含许多个单一的逻辑。只要有一个逻辑没有执行成功,那么都算失败。 所有的数据都回归到最初的状态(回滚)。

使用命令行方式演示事务

  • 开启事务

    start transaction;

  • 提交/回滚事务

    commit—-提交事务(数据将会写到磁盘上的数据库)
    rollback—-数据回滚,回到最初的状态。

  1. 关闭自动提交功能。

  1. 演示事务

使用代码方式演示事务(针对连接)

1
2
3
4
5
1. 关闭自动提交的设置  conn.setAutoCommit(false )

2. 提交事务 conn.commit();

3. 回滚事务 conn.rollback();

单元测试代码(只是在连接前关闭自动提交,然后操作结束后关闭事务,然后错误的时候提示回滚)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
@Test  //使用单元Junit测试
public void testTransaction(){
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;

try {
conn = JDBCUtil.getConn();

//连接,事务默认就是自动提交的。 关闭自动提交。
conn.setAutoCommit(false);

String sql = "update account set money = money - ? where id = ?";
ps = conn.prepareStatement(sql);

//扣钱, 扣ID为1 的100块钱
ps.setInt(1, 100);
ps.setInt(2, 1);
ps.executeUpdate();

int a = 10 /0 ;
//加钱, 给ID为2 加100块钱
ps.setInt(1, -100);
ps.setInt(2, 2);
ps.executeUpdate();

//成功: 提交事务。
conn.commit();

} catch (SQLException e) {
try {
//事变: 回滚事务
conn.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
e.printStackTrace();

}finally {
JDBCUtil.release(conn, ps, rs);
}
}

二、事务知识点

事务特性(ACID)

  • 原子性

指的是 事务中包含的逻辑,不可分割。

  • 一致性

指的是 事务执行前后,数据完整性.

  • 隔离性

指的是 事务在执行期间不应该受到其他事务的影响

  • 持久性

指的是 事务执行成功,那么数据应该持久保存到磁盘上。

事务的安全隐患

不考虑(×)隔离级别设置,那么会出现以下问题:

脏读:一个事务读到另外一个事务还未提交的数据
不可重读: 一个事务读到了另外一个事务提交的数据,造成了前后两次查询结果不一致。
幻读

丢失更新:两个事物对同一个事务进行更改,A事务更改之后B更改/B回滚,A更改的被覆盖。

解决方法:

  1. 悲观锁

    可以在查询的时候,加入 for update(A更改之后让B停止更改,然后B之后可以改)

  1. 乐观锁

    要求程序员自己控制(添加version版本)

可串行化(顺序)

  如果有一个连接的隔离级别设置为了串行化 ,那么谁先打开了事务, 谁就有了先执行的权利, 谁后打开事务,谁就只能得着,等前面的那个事务,提交或者回滚后,才能执行。
  但是这种隔离级别一般比较少用。 容易造成性能上的问题。 效率比较低。

  • 效率划分,从高到低

读未提交 > 读已提交 > 可重复读 > 可串行化

  • 拦截程度 ,从高到底

可串行化 > 可重复读 > 读已提交 > 读未提交

两种数据库默认隔离级别:

mySql 默认的隔离级别是 可重复读

Oracle 默认的隔离级别是 读已提交


×

纯属好玩

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

文章目录
  1. 1. 一、事务(Transaction)
    1. 1.1. 使用命令行方式演示事务
    2. 1.2. 使用代码方式演示事务(针对连接)
  2. 2. 二、事务知识点
    1. 2.1. 事务特性(ACID)
    2. 2.2. 事务的安全隐患
    3. 2.3. 可串行化(顺序)
,