1:事务是什么?
事务(Transactional) 就是把多个要做的操作组合成一个整体.利用事务的特性来保证操作的安全性,如果一个事务做到一半出现任何错误,就会进行回滚操作.来恢复成最初的模样.
?2:事务的特性 (具有ACID的特性)
(1) A ?原子性(atomicity) ?: 事务是一个不可分割的工作单位,事务中的操作要么都修改,要么都不修改。
(2) C 一致性(consistency):事务在完成时,必须是所有的数据都保持一致状态。
(3) I 隔离性(isolation):一个事务的执行不能被其他事务所影响。
(4) D 持久性(Durability): 持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的.
3:mysql中的事务使用
mysql中的事务默认是自动提交的,在执行insert,update,delete语句时候每一条sql语句就是一个事务。
3.1 查看事务的提交方式: select @@autocommit; 结果为1表示使用自动提交. 为0表示手动提交
3.2 修改事务的提交方法: set?@@autocommit=0;? ?修改为手动提交
3.3 提交事务的方法:??commit ;? 当mysql的事务修改为手动提交的时候,执行完sql会出现数据没有更改的情况, 只有当commit执行后 才会更改数据.
3.4 开启事务的方法:?start transaction 或?begin;? 事务启动后,所有的sql都会暂时停止修改,只有执行commit才会看到更新后的数据.
3.5 回滚事务的方法:?rollback;? ??
4:并发事务导致的问题
?4.1:脏读
一个事务读取到另外一个事务还没有提交的数据
4.2:不可重复读
一个事务先后读取同一条记录,但两次读取的数据不同
4.3:幻读
一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据后,又发现这行数据已经存在了,像出现了幻觉一样.
5:事务隔离级别
??MySQL 包括的事务隔离级别如下:
- 读未提交(READ UNCOMITTED)
- 读提交(READ COMMITTED)
- 可重复读(REPEATABLE READ) mysql默认使用的
- 串行化(SERIALIZABLE)
不同隔离级别对应解决的问题
5.1:读未提交(READ UNCOMITTED):
? ? 在该隔离级别下,所有事务都可以看到其它未提交事务的执行结果。所以会导致脏读的情况.性能最好,但安全性最差,所以基本不会使用该级别.
5.2:读提交(READ COMMITTED)
该隔离级别下,一个事务从开始到提交前所做的任何改变都是不可见的,事务只能读取到已经提交的事务所做的改变。也就是会出现 一个事务执行期间读取到其他事务未提交和已提交的两种不同的数据,所以会出现不可重复读的问题.但是能解决脏读.?
5.3:可重复读(REPEATABLE READ)
一个事务只能读取到某条记录后,即使其它事务修改了该记录的值并且提交,读到的仍是第一次读到的值,而不是每次都读到不同的数据。那么这种隔离级别就称之为可重复读。是mysql默认的隔离级别
5.4:串行化(SERIALIZABLE)
该级别主要通过强制事务排序来解决幻读问题。简单来说,就是在每个读取的数据行上加上共享锁实现,这样就避免了脏读、不可重复读和幻读等问题。但是该事务隔离级别执行效率低下,且性能开销也最大,所以一般情况下不推荐使用。
6:修改事务隔离级别
6.1:查看事务隔离级别的sql:? ? select @@transaction_isolation;
6.2:当前会话的隔离级别 :?set? session??transaction isolation? level? ? ?READ UNCOMITTED
6.3:设置全局的隔离级别? ? ?set? global?transaction isolation? level? ? ?READ UNCOMITTED
|