事务的概念:数据库
事务指逻辑上的一组操做,组成这组操做的各个单元,要么所有成功,要么所有不成功。
事务的特性:并发
A:原子性(Atomicity):说明事务是一个不可分割的单位。 C:一致性(Consistency):事务必须使数据库从一个一致性状态变换到另一个一致性状态.(好比转帐) *I:隔离性(Isolation):一个事务不能被其余事务打扰。 D:持久性(Durability):事务一旦提交,就应该被永久保存起来。
事务的隔离级别:性能
未提交读(READ UNCOMMITTED):脏读、不可重复读、虚读都有可能发生。 (隔离级别最低,并发性能高) 提交读/不可重复读(READ COMMITTED):能避免脏读,不可重复读、虚读都有可能发生。 (锁定正在读取的行 ,Oracle默认的隔离级别) 可重复读(REPEATABLE READ):能避免脏读、不可重复度,虚读有可能发生。 (锁定所读取的全部行 ,MySQL默认的隔离级别) 可串行化(SERIALIZABLE):能避免脏读、不可重复度、虚读。 (锁表)
说明:线程
1)多个线程开启各自事务操做数据库中数据时,数据库系统要负责隔离操做,以保证各个线程在获取数据时的准确性。 2)MySQL中Innodb引擎经过数据库锁(表锁和行锁)来实现事务的隔离。 3)若是不考虑事务的隔离级别,会出现如下“不正确”的状况: 1>脏读:指一个事务读到了另外一个事务中未提交的数据。 2>不可重复读:在一个事务内读取表中的某一行数据,屡次读取的结果不一样。重点是修改 注:不可重复读和脏读的区别是:脏读是读取了另外一个事务中未提交的脏数据,不可重复读是读取了另外一个事务已提交了的数据。 3>虚读(幻读):在一个事务内读取到了另外一个事务插入的数据,致使先后读取的记录数不一致。重点在于新增或者删除
JDBC中设置事务的隔离级别:code
Connection.setTransactionIsolation(int level); // Level:Connection中的常量 // 在开启事务前先设置隔离级别 Conn.setTransactionIsolation(Connection.*); Conn.setAutoCommit(false);
MySQL中控制事务隔离级别的语句:事务
查看当前事务的隔离级别: select @@tx_isolation; 设置当前事务隔离级别: set transaction isolation level 隔离级别;