mysql---事务

mysql事务

事务是一个机制,一个操作序列。包含了一组数据库的操作命令,所有命令都是一个整体,向系统提交或者撤销的操作,要么都执行,要么都不执行,不可分割的单位。

事务的特点ACID:

A: 原子性 最小单位,事务里的所有条件都是一个整体,不可分割。要么都成功,要么都失败。
C: 一致性 事务开始前,事务结束后,数据库的完整性约束没有被破坏。

I: 隔离性:指在并发环境中,当不同的事务同时操纵相同的数据时,每个事务都有各自的完整数据的空间对数据进行修改的所有并发事务是彼此隔离,表名事务是独立

D: 持久性:数据一旦提交,事物的效果将被永久的保留在数据库中,而且不会被回滚。

                事务完成时,数据必须保持一致
                事务开始前,数据库中的存储数据处于一致状态
                事务进行中,数据处于不一致状态
                事务最终完成时,必须再次
脏读:一个事务能看到另一个事务未提交的内容。

修改数把的事务可以另一个使用相同数据的事务开始之前访问这些数据。或者在另一个使用相同的事务结束之后访问这些数据。

mysql 隔离级别

1、未提交读(read uncommitted),能看到未提交的数据,允许脏读,允许一个事务可以看到其他事务未提交的修改。
2、提交读(read committed):事务只能查看以及提交的修改,未提交的修改是不可见的,防止脏读orcale sql-server。
3、可重复读:也就是mysql的默认隔离级别。确保如果一个事务中执行两次相同的select语句时,都能得到相同的结果,不管其他事物是否提交。可以防止脏读以及不可重复读。
4、串行读:锁表,完全串行化,每一个事物都隔离,读写阻塞。降低数据库的效率。

事务隔离级别的作用范围

1、全局(global):对所有的会话有效。
2、会话级(session):只对当前的会话有效。

查询global全局事务的隔离级别

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';

session会话事务的隔离级别

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、幻读:一个事务对一个表中的数据进行修改,可能会涉及到表中的全部数据
另一个事务也修改了表中数据,插入了一行新的数据。前一个事务会发现表中还有数据没有修改,类似于幻觉。

举个例子,假设事务A查询了某个表中salary大于等于5000的记录,然后事务B又插入了一条salary为6000的记录,这时候如果事务A再次查询该表,发现查询结果里多了一条记录,看上去就像是发生了“幻觉”。
工作中只生效最终结果。

3、丢失更新:两个事务同时修改一条记录,A先记录,B也修改了记录,B一旦提交会覆盖A的结果。
 

以上三种情况,如何避免???
1、权限控制。优:定位问题,权限分割给
2、根据使用情况来使用隔离级别
     生产环境---最好是提交读和可重复读
     测试环境---无所谓
3、生产环境只能允许一个人对一个事务进行操作,其他人不允许操作。

总结:在事务管理中,原子性是基础,隔离性是手段,一致性是目的 持久性是最终的结果

事物的控制语句

1、显示开启的事务

begin
start transaction

2、提交事务

commit
commit work

mysql 提交事务是默认自动提交
可以用set 来设置mysql的提交方式

查看终端是否是自动提交

show variables like 'autocommit';
set autocommit=0;
0关闭 1开启

关闭自动提交后的结果

当数据库关闭自动提交时,所有的操作都需要手动提交才能生效。这意味着,如果你执行了一个修改操作(比如插入、更新、删除等),它不会立即生效,而是在你手动提交之后才会生效。这样做的好处是可以避免一些不必要的误操作,因为你可以在手动提交之前检查所有的操作,以确保它们是正确的。另外,这样也可以提高性能,因为数据库不需要为每个操作都自动提交,从而减少了一些开销。

1····自动提交关闭后,不需要begin开启事务,更新内容不会同步到数据库,只对当前终端可查看和更新,即:其他终端查询不到更新数据。

2····commit提交之后,更新的数据才会同步到数据库,即:其他终端可以查询到更新的数据。

3、创建回滚点

一个事务可以有多个回滚点

格式:savepoint s1;

回滚到还原点

回滚:撤销正在进行的所有未提交的修改

格式:rollback to s1;

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值