一.关于事务
1.含义:事务就是一件完整的事情,包含多个操作单元,这些操作要么全部成功,要么全部失败.
2.MySQL中的事务:
MySQL中的事务默认自动提交,一条SQL语句就是一个事务.
3.事务的开启和关闭:
开启:setAutoCommit(false)方法关闭事务的自动提交,开启事务
关闭:commit()方法
回滚:rollback()方法

try {		
		// 开启事务
		conn = JDBCUtils.getConnection();
		conn.setAutoCommit(false);
		// 转账操作
		// 获取dao对象
		AccountDaoTransaction adt = new AccountDaoTransaction();
		adt.transferOut(from,money,conn);
		adt.transferInt(to,money,conn);
		point = conn.setSavepoint("转账业务完成");// 设置埋点
		//int a = 10/0;
		// 提交事务
		conn.commit();
	} catch (Exception e) {
		// TODO: handle exception
		e.printStackTrace();
		// 回滚事务
		try {
			if (point == null) {
				// 没到埋点
				conn.rollback();
			}else {
				// 到埋点,回滚到埋点地方
				conn.rollback(point);
				conn.commit(); // 提交事务
			}	
		} catch (SQLException e1) {
			e1.printStackTrace();
		}
		try {
			throw e;
		} catch (Exception e1) {
			e1.printStackTrace();
		}
	}finally {
		try {
			conn.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

4.事务的特性(ACID)
1).原子性:事务里面的操作单元不可切割,要么全部成功要么全部失败.
2).一致性:事务执行前后业务状态和其它业务状态保持一致.
3).隔离性:一个事务执行的时候最好不要受到其它事务的影响.
4).持久性:一个事务提交或者回滚,这个状态要持久化到数据库中.
5.不考虑隔离性会出现的问题
1).脏读:在一个事务中读取到另一个事务未提交的数据.
2).不可重复读:在一个事务中,两次查询的结果不一致(针对update操作)
3).虚读(幻读):在一个事务中两次的查询结果不一致.(针对insert操作)
四种隔离级别的效率:
read uncommitted>read committed>repeatable read>serializable
四种隔离级别的安全性
read uncommitted<read committed<repeatable read<serializable
开发中绝对不允许脏读发生.
mysql中默认级别:repeatable read 可重复读 可以避免脏读和不可重复读的发生
oracle中默认级别:read committed 读已提交 可以避免脏读的发生
二.ThreadLocal:当前线程对象
1.可以实现线程操作中,调用set()存储数据,在线程的后续操作中都可以通过get()获取数据,线程结束的时候调用remove()方法删除数据

static ThreadLocal<String> tl =  new ThreadLocal<String>();
 	public static void main(String[] args) {
		tl.set("李四");
		sayHi();
	}
	private static void sayHi() {
		// TODO Auto-generated method stub
		System.out.println("吃了吗");
		System.out.println(tl.get());
		eat();
		
	}
	private static void eat() {
		// TODO Auto-generated method stub
		System.out.println("吃炸鸡");
		System.out.println(tl.get());
	}