背景:
为什么要使用事务这个技术?现在很多软件都是多用户,多程序,多线程的,对同一个表可能同时又很多人在用,为保持数据的一致性,所以提出了事务的概念;
eg:A给B打钱,A的账户-100后,B的账户就要+100,这两个update语句必须作为一个整体来执行,不然A扣钱了,B没有加钱这种问题很难处理;
一.什么是事务?
事务就是一段sql语句的批处理,但是这个批处理是一个atom(原子),不可分割,要么都执行,要么回滚,都不执行;
二.事务特性(ACID)
1.原子性:确保工作单元内的所有操作都成功完成, 否则事务将被中止在故障点,和以前的操作将回滚到以前的状态;
2.一致性:确保数据库正确地改变状态后,成功提交事务;
3.隔离性:使事务操作彼此独立的和透明的;
4.持久性:确保提交的事务的结果或效果的的系统出现故障时任然存在;
背景:在分布式系统中,通常会有多个线程链接到数据库中同时对一个表 进行操作(这里的同时并不表示同一个时间点,而是同时竞争CPU的资源,至于如何调度,就要看线程和操作系统如何进行调度了),这种情况下如果会话的事务设置不当就会导致数据混乱;
三:事务的隔离级别
1.serializable :可避免脏读,不可重复读,虚读情况的发生 ;(单线程访问的数据库,会导致性能降低很多)
2.repeatable read:可避免脏读,不可重复读情况的发生;(可重复读,是MySQL默认的事务隔离级别)
3.read committed:可避免脏读情况的发生;(读取已提交的数据)
4.read uncommitted:最低级别,以上情况均无法保证;(读取到了未提交的数据)
脏读:读到未提交的数据;
不可重复读:不可重复读是指读取到了别人对表中的某一条记录进行了修改,导致前后读取的数据不一致;重复读指的是我们每次读取到的结果都要一致;
幻读:在一个事务内读取到了别的事务插入的数据;
mysql事物处理实例
MYSQL的事务处理主要有两种方法
1.用begin,rollback,commit来实现
begin开始一个事务
rollback事务回滚
commit 事务确认
2.直接用set来改变mysql的自动提交模式
mysql默认是自动提交的,也就是你提交一个query,就直接执行!可以通过
set autocommit = 0 禁止自动提交
set autocommit = 1 开启自动提交
来实现事务的处理。
但要注意当用set autocommit = 0 的时候,你以后所有的sql都将作为事务处理,直到你用commit确认或 rollback结束,注意当你结束这个事务的同时也开启了新的事务!按第一种方法只将当前的做为一个事务!