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