数据库的四大事务特性及事务的隔离级别
事务的四大特性ACID
- 原子性:事务中的所有额操作时不可在分割的原子单位,事务中的全部操作,要么全部执行成功,要么全部执行失败,
- 一致性:事务执行后,数据库状态和业务保持一致,如转账业务,无论事务执行成功与否,那么参与转账的两个账号余额之和是不变的
- 隔离性:指的是在并发操作中,不同事务之间应该隔离开来,是每个并发的事务不会相互干扰
- 持久性:一旦事务提交成功,事务中的所有的事务操作都必须被持久化都数据库中,即使提交事务后,数据库马上崩溃,在数据库重启时,也必须保证通过某种机制能够恢复数据。
mysql 事务的处理
- 开启事务start transaction开启一个事务,然后就可以执行多条sql语句
- 回滚事务 rollback 表示回滚到事务的起点
- 提交事务 commit 也就是,mysql中的多条sql操作,持久化到了数据库中
JDBC 处理事务
- 通过Connection 对象完成,必须是同一个Connection 处理一个事务
- 方法
- setAutoCommit(boolean) 来设置事务处理
- true 默认状态,也就是执行一条sql语句,提交一次
- false 设置为事务处理
- commit() 提交,将多条sql语句操作进行提交,持久化到数据库中
- rollback() 回滚,回到事务的起点。
- setAutoCommit(boolean) 来设置事务处理
没有事务的隔离会发生的几种情况
- 脏读
- 在一个事务处理中,读取了另一个事务处理没有提交的数据
- 不可重复读
- 一个事务在多次查询一条记录,但是结果是不一样的,因为被另一个事务修改,并且提交了
- 脏读和不可重复读的区别
- 脏读是读取到了另一个事务没有提交的数据,不可重复读是读取到了另一个事务提交的数据
- 虚度(幻读)
- 幻读是事务非独立处理的结果,比如;一个事务处理,讲一个表格的某一列的所有的值,从1修改为2,这个时候,另一个事务给表格插入了一行,该列的值是1,那么,第一个事务的处理感觉出现了幻觉,为什么还有一行没有修改呢,这就是幻读。
- 幻读和不可重复读的区别:
- 两者都是读取到了另一个事务的提交的数据
- 不可重复读读取到的是同一个数据项,但是幻读针对的是一个数据整体
mysql提供的四种隔离级别
- Serializable(串行化):可以避免脏读,不可重复读,幻读的放生
- Repeatable(可重复读):可以避免脏读,不可重复读的发生
- Read Committed(读已经提交):可避免脏读的发生
Read Uncommitted(读没有提交):最低的级别,任何情况都不能保证
-
==说明==
- 隔离级别最高的是Serializable,最低的是Read Uncommitted
- 级别越高,性能越低,
- 像Serializable这样的级别,就是以锁表的方式类似于Java多线程总的同步锁,使得其他线程只能在外等候
- mysql默认的 隔离级别是Repeatable
mysql 设置事务隔离级别
- 在mysql查看当前事务的隔离级别
- 命令:select @@tx_isolation
-
在mysql中设置事务的隔离级别
- mysql 事务的隔离级别的设置,必须是在事务开启之前
-
命令:
方式1: set [glogal | session] transaction isolation level 隔离级别名称;
方式2:set tx_isolation=’隔离级别名称;’
JDBC设置事务隔离级别
- 使用Connection对象
- 使用JDBC设置事务的隔离级别的时候,必须是在设置setAutoCommit(boolean)方法之前,
调用方法setTransactionIsolation(level)
-
==注意==
- 隔离级别设置只是对当前的连接有效。
- 对于mysql而言,一个mysql命令窗口就是一个连接,
- 对于JDBC而言,一个COnnection对象,就是一个连接