Java Transaction事务

概述

    事务指的是逻辑上的一组操作,组成这组操作的各个单元要么全都成功,要么全都失败.
    事务作用:保证在一个事务中多次操作要么全都成功,要么全都失败.

Mysql事务操作:

start transaction; 开启事务
commit; 提交事务
rollback; 回滚事务

JDBC事务操作:

conn.setAutoCommit(false) 开启事务
conn.commit() 提交事务
conn.rollback() 回滚事务

事务特性

  • 原子性(Atomicity)原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
  • 一致性(Consistency)事务前后数据的完整性必须保持一致。
  • 隔离性(Isolation)事务的隔离性是指多个用户并发访问数据库时,一个用户的事务不能被其它用户的事务所干扰,多个并发事务之间数据要相互隔离。
  • 持久性(Durability)持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。

隔离问题

  如果不考虑隔离性,事务存在3种并发访问问题。

  1. 脏读:一个事务读到了另一个事务未提交的数据.
  2. 不可重复读:一个事务读到了另一个事务已经提交(update)的数据。引发另一个事务,在事务中的多次查询结果不一致。
  3. 虚读 /幻读:一个事务读到了另一个事务已经提交(insert)的数据。导致另一个事务,在事务中多次查询的结果不一致。

  数据库规范规定了4种隔离级别,分别用于描述两个事务并发的所有情况。

  1. read uncommitted 读未提交,一个事务读到另一个事务没有提交的数据。
    a) 存放:3个问题(脏读、不可重复读、虚读)。
    b) 解决:0个问题
  2. read committed 读已提交,一个事务读到另一个事务已经提交的数据。
    a) 存放:2个问题(不可重复读、虚读)。
    b) 解决:1个问题(脏读)
  3. repeatable read :可重复读,在一个事务中读到的数据始终保持一致,无论另一个事务是否提交。
    a) 存放:1个问题(虚读)。
    b) 解决:2个问题(脏读、不可重复读)
  4. serializable 串行化,同时只能执行一个事务,相当于事务中的单线程。
    a) 存放:0个问题。
    b) 解决:3个问题(脏读、不可重复读、虚读)

 安全和性能对比
 安全性:serializable > repeatable read > read committed > read uncommitted
 性能 : serializable < repeatable read < read committed < read uncommitted

 常见数据库的默认隔离级别:
 MySql:repeatable read
 Oracle:read committed

ThreadPool

    java.lang.ThreadLocal 该类提供了线程局部 (thread-local) 变量,用于在当前线程中共享数据。ThreadLocal工具类底层就是一个Map,key存放的当前线程,value存放需要共享的数据。

public class JdbcUtils {

	// 连接池
	private static ComboPooledDataSource dataSource = new ComboPooledDataSource("igeek");
	// 给当前线程绑定 连接
	private static ThreadLocal<Connection> local = new ThreadLocal<Connection>();

	/**
	 * 获得连接
	 * 
	 * @return
	 */
	public static Connection getConnection() {
		try {
			// #1从当前线程中, 获得已经绑定的连接
			Connection conn = local.get();
			if (conn == null) {
				// #2 第一次获得,绑定内容 – 从连接池获得
				conn = dataSource.getConnection();
				// #3 将连接存 ThreadLocal
				local.set(conn);
			}
			return conn; // 获得连接
		} catch (Exception e) {
			// 将编译时异常 转换 运行时 , 以后开发中 运行时异常使用比较多的。
			// * 此处可以编写自定义异常。
			throw new RuntimeException(e);
			// * 类与类之间 进行数据交换时,可以使用return返回值。也可以自定义异常返回值,调用者try{} catch(e){
			// e.getMessage() 获得需要的数据}
			// throw new MyConnectionException(e);
		}
	}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值