事务Transaction

事务Transaction

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

  • 为什么要有事务?
    为了确保逻辑的成功。 例子: 银行的转账。

使用命令行方式演示事务(了解)

  • 开启事务

    start transaction;

  • 提交或者回滚事务

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

  1. 关闭自动提交功能。
    关闭自动提交
  2. 演示事务
    在这里插入图片描述

使用代码方式演示事务

代码里面的事务,主要是针对连接来的。
如果再开一个连接对象,那么是默认的提交。

  1. 通过conn.setAutoCommit(false )来关闭自动提交的设置。

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

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

@Test
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

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

  • 一致性
    指的是 事务执行前后。数据完整性

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

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

事务的安全隐患 &隔离级别

在这里插入图片描述

1.读问题

不考虑隔离级别设置,那么会出现读问题,写问题


  1. 脏读 不可重读, 幻读

  2. 丢失更新

脏读

一个事务读到另外一个事务还未提交的数据

不可重复读

一个事务读到了另外一个事务提交的数据 ,造成了前后两次查询结果不一致。
("读已提交"隔离级别能够屏蔽 脏读的现象, 但是引发了另一个问题 ,不可重复读。)
幻读
一个事务读到了另一个事务insert的数据 ,造成前后查询结果不一致 。

2.隔离级别

读未提交==>引发问题: 脏读

读已提交==> 解决: 脏读 , 引发: 不可重复读

可重复读==>解决: 脏读 、 不可重复读 , 未解决: 幻读

可串行化==> 解决: 脏读、 不可重复读 、 幻读。

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

在这里插入图片描述
mySql 默认的隔离级别是 可重复读

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

  • 按效率划分,从高到低

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

  • 按拦截程度 ,从高到底

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


写问题 --丢失更新

丢失更新

解决丢失更新

  • 悲观锁

可以在查询的时候,加入 for update(数据库锁机制:排他锁)

在这里插入图片描述

  • 乐观锁

要求程序员自己控制。

img

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值