事务是一种机制,一个操作序列,包含了一组数据库的操作命令,所有命令都是一个整体,向系统提交或者撤销的操作,要么都执行,要么都不执行。
不可分割的单位。
A:原子性,最小单位,必须作为一个整体,事务里的所有条件都是一个整体,不可分割,要么成功,要么都失败
C:一致性 事务开始之前和事务结束之后,数据库的完整性约束没有被破坏。事务完成时,数据必须属于一致状态。
l:隔离性:指在并发环境中,当不同事务同时操作相同的数据时,每个事务都要各自的完整数据空间。对数据进行修改的所有并发事务是彼此隔离的,表明事务必须是独立的。
D:持久性:数据一旦提交,事务的效果将会被永久的保留在数据可中,而且不会被回滚
mysql支持四种隔离级别:
1.未提交读,允许脏读,允许一个事务可以看到其他事务未提交的修改。
commit
2.提高读:事务只能查看已经提交的修改,未提交的修改是不可见的。防止脏读,(orcale sql sever)
3.可重复读:也是musql的默认隔离级别,确保如果在一个事务中执行两次相同的select语句时,都能得到相同的结果,不管其他事务是否提交修改,可以防止脏毒以及不可重复读
4.串行读,锁表、完全串行化,每一个事务都隔离,读写都阻塞。
show GLOBAL variables like '%isolation'; 查询全局事务的隔离级别
select @@global.tx_isolation; 查询全局事务的隔离级别
show session variables like '%isolation'; 会话级:只对当前的会话有效
select @@session.tx_isolation; 会话级:只对当前的会话有效
set global transaction isolation level read UNCOMMITTED; 修改全局隔离级别
set @@global.tx_isolation='read-UNCOMMITTED';
set session transaction isolation level read UNCOMMITTED; 修改会话
set @@session.tx_isolation='read-uncommitted';
脏读:另外一个事务能够看到另一个事务未提交的修改结果
不可重复读:一个事务内,多次读同一个数据,前一个事务还没有结束,另一个事务也访问该数据。在一个事务之内,两次查询到的结果不一致。读不到相同的数据内容。
幻读:一个事务对一个表中的数据进行修改,可能会涉及到表中的全部数据,另一个事务也修改了表中的数据,插入了一行新的数据。前一个事务会发现表中还有数据没有修改,类似于幻觉。
丢失更新:两个事务同时修改一条记录,A先记录,b也修改了记录,b一旦提交会覆盖A的结果
以上这些情况如何避免:
1.权限控制
2.根据情况来使用隔离级别
生产环境---最好是提交读和可重复读
测试环境----无所谓
3.生产还换只能允许一个人对一个事务进行操作,其他人不允许操作。
BEGIN
start transaction 显示的开启事务
commit
commit work 提交事务
rollback 回滚
rollback work
回滚 撤销正在进行的所有未提交的修改
savepoint s1:创建回滚点,一个事务可以有多个回滚点
rollback to s1:回滚到回滚点