事务

#事务

1.什么是事务?

举例:
在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,
也要删除和该人员相关的信息,这样,这些数据库操作语句就构成一个事务!

2.事务是必须满足4个条件(ACID)

原子性:一组事务,要么成功;要么撤回。

一致性:事务执行后,数据库状态与其他业务规则保持一致。
如转账业务,无论事务执行成功否,参与转账的两个账号余额之和应该是不变的。

隔离性:事务独立运行。一个事务处理后的结果,影响了其他事务,那么其他事务会撤回。
事务的100%隔离,需要牺牲速度。

持久性:软、硬件崩溃后,InnoDB数据表驱动会利用日志文件重构修改。可靠性和高速度不可兼得,
innodb_flush_log_at_trx_commit 选项 决定什么时候吧事务保存到日志里。

3.JDBC中的事务

setAutoCommit(boolean):
设置是否为自动提交事务,
如果true(默认值为true)表示自动提交,也就是每条执行的SQL语句都是一个单独的事务,
如果设置为false,那么相当于开启了事务了;con.setAutoCommit(false) 表示开启事务。
commit():提交结束事务。
rollback():回滚结束事务。

格式:

1
2
3
4
5
6
7
try{
con.setAutoCommit(false);//开启事务
......
con.commit();//try的最后提交事务
} catch() {
con.rollback();//回滚事务
}

4、并发事务问题

因为并发事务导致的问题大致有5类,其中两类是更新问题三类是读问题。

脏读(dirty read):读到另一个事务的未提交新数据,即读取到了脏数据;
不可重复读(unrepeatable):对同一记录的两次读取不一致,因为另一事务对该记录做了修改;
幻读(虚读)(phantom read):对同一张表的两次查询不一致,因为另一事务插入了一条记录。

5、四大隔离级别

4个等级的事务隔离级别,在相同的数据环境下,使用相同的输入,执行相同的工作,根据不同的隔离级别,可以导致不同的结果。不同事务隔离级别能够解决的数据并发问题的能力是不同的。

1、SERIALIZABLE(串行化)

不会出现任何并发问题,因为它是对同一数据的访问是串行的,非并发访问的;
性能最差

2、REPEATABLE READ(可重复读)(MySQL)

防止脏读和不可重复读,不能处理幻读
性能比SERIALIZABLE好

3、READ COMMITTED(读已提交数据)(Oracle)

防止脏读,不能处理不可重复读和幻读;
性能比REPEATABLE READ好

4、READ UNCOMMITTED(读未提交数据)

可能出现任何事物并发问题,什么都不处理。
性能最好