一.关于事务
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());
}