MySQL事务
1.什么是事务?
要么都成功,要么都失败!
2.事务原则 (ACID)
事务原则:ACID原则
原子性:表示事务是一个不可分割的整体,要么都成功,要么都失败
一致性:事务前后数据完整性要保持一致
隔离性:事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。
持久性:持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响
3.事务隔离级别
隔离级别:读未提交,读已提交,可重复度,串行化
事务隔离性导致的问题:
由于事务的隔离性,导致了一些问题:脏读,不可重复读,幻读
脏读:一个事务读取了另一个事务没有提交到数据
不可重复读:事务在多次读取某个数据的时候,发现数据并不相同,可能是先读取到了其他事务未提交的数据,后又读到了提交后的数据。
幻读:事务在多次读取数据的时候,发现读取到底数据数量不相同,存在未读取到的数据,仿佛没有读取过,一般发生在存在其他事务进行了数据插入,先读取到了还未插入的时候的表数据,后又读取到了插入的数据。
为了解决事务隔离所产生的问题,我们可以设置事务隔离级别:
事务隔离级别:
读未提交:最低的隔离级别,不能防止上面出现的问题
读已提交:可以防止脏读情况发生
可重复读:可防止脏读,不可重复读的情况发生
串行化:可防脏读、幻读和不可重复读的情况发生。
4.如何配置事务隔离级别
4.1 通过sql命令实现
set transaction isolation level 设置事务隔离级别
select @@tx_isolation 查询当前事务隔离级别s
Serializable 可避免脏读、不可重复读、虚读情况的发生。(串行化)
Repeatable read 可避免脏读、不可重复读情况的发生。(可重复读)
Read committed 可避免脏读情况发生(读已提交)。
Read uncommitted 最低级别,以上情况均无法保证。(读未提交)
4.2通过java层面实现
通过Connection对象配置事务隔离级别
Connection对象的方法:setAutoCommit 或 setTransactionIsolation
TRANSACTION_SERIALIZABLE 指示不可以发生脏读、不可重复读和虚读的常量。
TRANSACTION_REPEATABLE_READ 指示不可以发生脏读和不可重复读的常量;虚读可以发生。
TRANSACTION_READ_UNCOMMITTED 指示可以发生脏读、不可重复读和虚读的常量。
TRANSACTION_READ_COMMITTED 指示不可以发生脏读的常量;不可重复读和虚读可以发生。