事务安全

在实际的开发中,有可能一个业务需要一次发送多条SQL语句给数据库执行,那么一次性执行多条语句的时候,就会出现安全性问题,比如在一次转账操作中,A向B转500元钱,A的账户余额要减少500,B的账户余额要增加500,但是如果再刚好减少的同时,数据库或者程序发生了故障,A减少了500元钱,但是B并没有接收到:这时,就出现了事务安全问题。

事务安全

 MySql中有两种方式进行事务的操作:①手动提交事务;②自动提交事务

手动提交事务

相关SQL语句:

start transaction :开启事务

commit :提交事务

rollback:回滚事务    :回滚是指对一个事务是否成功进行判断,如果两条成功才算都成功,有一条失败就回滚到设置的回滚点,都不执行
                                   或者说是将回滚点和回滚语句之间的操作再反过来执行一次,一般用于数据出错的时候进行回滚,但是在MySql语句
                                  一旦中间发生错误一次操作中下面的语句就都不执行了,回滚语句也不会执行,所以这一般是搭配其他程序进行执行
                                  比如JAVA程序中,出现出错,我们可以把回滚语句放入catch块中进行回滚,来缓和中间发生的错误。

手动提交事务使用步骤:

第1种情况:开启事务 -> 执行SQL语句 -> 成功 -> 提交事务

第2种情况:开启事务 -> 执行SQL语句 -> 失败 -> 配合其他程序进行回滚事务  

案例演示:

--创建表 
create table tb1(
id int,
name varchar(100),
salary DOUBLE);
--插入数据
insert into tb1 values 
(1,'Tom',1000),
(2,'Jerry',1000);

start transaction;	-- 开启事务

update tb2 set salary=salary+500 where name = 'Tom';
update tb2 set salary=salary-500 where name = 'Jerry';

commit;  -- 提交事务

当执行开启事务的时候,下面的语句就会把执行成功的结果存到一个缓存文件中,等待着commit语句的执行,如果成功到达commit语句执行,会把前面的执行结果一次性存入到数据库中;如果其中发生错误,那么这个事务就会中断,但是如果有执行成功的语句也会把修改的结果存入到缓存文件中,因为错误导致了下面的语句包括commit语句都不会执行,然而这里错误发生的地方前面的语句的执行结果不会受到影响,当下次成功的进行commit语句或者其他语句有执行(如果用Navicat的话在没有commit之前但是执行了其它语句可能会出现能够利用select查询出来已经改变的结果,但是直接在客户端里不能查出来结果,只有commit之后才会出现更改后的结果)

-- 演示回滚点
start transaction;	-- 开启事务

update tb2 set salary=salary+500 where name = 'Tom';
savepoint aaa;  -- 这里的aaa是一个回滚点名称,可以自定义
update tb2 set salary=salary-500 where name = 'Jerry';
rollback to aaa;
commit;  -- 提交事务

这里执行了一次成功的事务操作,当执行到rollback to 回滚点 语句时,程序会回滚到设置回滚点的地方,然后中间的操作不进行存储,然后再回到rollback语句继续往下面执行。这里演示的就是会把第二句操作回滚掉,就可以看作中间的不会运行,然后第一句可以执行,所以结果显示只有Tom的值发生了改变,但是Jerry没有发生改变

回滚操作一般配合其他程序使用,这里只是演示效果。真实开发中需要配合其他语言的错误检测机制来进行执行。

自动提交事务

 MySQL的每一条DML(增删改)语句都是一个单独的事务,每条语句都会自动开启一个事务,执行完毕自动提交事务,MySQL默认开始自动提交事务

事务原理

事务开启之后, 所有的操作都会临时保存到事务日志(上面所说的缓存文件), 事务日志只有在得到commit命令才会同步到数据表中,其他任何情况都会清空事务日志(rollback(会清除与回滚点之间的缓存),断开连接)

                                           

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值