MySQL事务总结

什么是事务(什么时候用事务)

MySQL中事务(Transaction)是不可再分的最小工作单元,它将多条DML(Data Manipulate Language)进行了组合捆绑来保证这些数据操作指令同时成功或者同时失败。

那么,什么时候需要使用事务呢。首先,我们需要知道和事务相关的语句只有DML语句。这个很好理解,因为事务的存在就是为了保证数据的完整性和安全性,而DML语句是数据库中处理数据的相关语句(insert, delete, update)。那么但我们遇到需要用多条DML语句作为一个整体处理数据时,我们就需要用事务机制来保护其完整性。

例如:有一件事情需要进行多个insert, update 和delete联合完成。可以是银行的转账(update, update), 更新转账人的账号信息,同时更新收到钱方的账户信息。如果这其中的任何一项没有完成,那么这件事情就算没有成功。这时,可以用数据库的事务机制将其进行捆绑来保证其一致。

update t_customer set balance = 700 where cusno = 1;
update t_customer set balance = 300 where cusno = 2;
上面的操作就是简单的实现了银行转账的过程,张三给李四转了300,需要完成张三账户扣300,李四账户加300才算是转账完成,这两个动作是
不可分割的。

事务的特性

事务包括四大特性:ACID
A(atomicity): 原子性:事务不可分割。(可能是提出这个定义时大家还不知道原子还能分割)
(#-.-)
C(consistency): 一致性:事务保证多条DML语句同时成功或失败。
I(isolation): 隔离型: 两个事务之间隔离。
D(durability): 持久性: 事务保证最终数据得持久化到硬盘中,事务才算成功。


事务使用的语句

和事务相关的两条最重要的语句是commit(提交) 和 rollback(回滚)。

我们可以把事务重的DML语句所执行的结果看作放在一个历史操作的缓存中。只有当事务执行commit指令,再将结果存储到硬盘文件中。如果执行rollback则回到执行事务中DML语句之前。

MySQL 中的数据是自动提交的,我们可以用start transaction(开启事务) 和end transaction(事务结束) 来手动控制。

演示(commit):

mysql> select * from t_customer;
+-------+----------+
| cusno | cusname  |
+-------+----------+
|     1 | zhangsan |
|     2 | lisi     |
+-------+----------+

mysql> insert t_customer values(3, 'wangwu');

mysql> insert t_customer values(4, 'zhaoliu');

mysql> select * from t_customer;
+-------+----------+
| cusno | cusname  |
+-------+----------+
|     1 | zhangsan |
|     2 | lisi     |
|     3 | wangwu   |
|     4 | zhaoliu  |
+-------+----------+

mysql> commit;

mysql> select * from t_customer;
+-------+----------+
| cusno | cusname  |
+-------+----------+
|     1 | zhangsan |
|     2 | lisi     |
|     3 | wangwu   |
|     4 | zhaoliu  |
+-------+----------+

演示(rollback):

mysql> select * from t_customer;
+-------+----------+
| cusno | cusname  |
+-------+----------+
|     1 | zhangsan |
|     2 | lisi     |
+-------+----------+

mysql> start transaction;

mysql> insert t_customer values(3, 'wangwu');

mysql> insert t_customer values(4, 'zhaoliu');

mysql> select * from t_customer;
+-------+----------+
| cusno | cusname  |
+-------+----------+
|     1 | zhangsan |
|     2 | lisi     |
|     3 | wangwu   |
|     4 | zhaoliu  |
+-------+----------+

mysql> rollback;

mysql> select * from t_customer;
+-------+----------+
| cusno | cusname  |
+-------+----------+
|     1 | zhangsan |
|     2 | lisi     |
+-------+----------+


事务的隔离性级别

事务的隔离性存在隔离级别,理论上存在四个级别:

第一级别:读未提交(read uncommitted)
对方事务还没提交,我们当前事务可以读到对方未提交的数据。这种隔离可能会读到脏数据(dirty data),对方可能将未提交的数据回滚。

第二级别:读已提交(read committed)
对方事务已提交的数据我方可以读取到,但是不可以重复读。如对方跟新数据,只能读取到跟新后的提交数据,不可重复读取之前的数据。对于第一级别解决了脏读现象。

第三级别:可重复读(repeated read)
可重复读取已经提交的数据,解决了不可重复读的问题,但是读取到的数据是幻象的,可能已经有新的跟新。

第四级别:序列化读/串行化读
两个事务不能并发,事务需要排队,效率比较低。

PS:
Oracle数据库默认隔离级别:读已提交。
MySQL数据库默认隔离级别:可重复读。


查询和修改隔离级别

我们可以用下面的语句来查询当前数据库的隔离级别。

show  variables like 'transaction_isolation';
或者 select @@transaction_isolation;

这个查询语句是对于MySQL8,MySQL8 将tx_isolation 重命名为 transaction_isolation。

如果我们需要更改数据库的隔离级别,可以用:

set global transaction isolation level read uncommitted;

PS: 修改了隔离级别后,需要exit推出sql再进来一遍才能看到隔离级别的跟新。

演示:

mysql> show variables like 'transaction_isolation';
+-----------------------+-----------------+
| Variable_name         | Value           |
+-----------------------+-----------------+
| transaction_isolation | REPEATABLE-READ |
+-----------------------+-----------------+

mysql> set global transaction isolation level read uncommitted;

mysql> exit;

export PATH=${PATH}:/usr/local/mysql/bin
mysql -u root -p                        

mysql> show variables like 'transaction_isolation';
+-----------------------+------------------+
| Variable_name         | Value            |
+-----------------------+------------------+
| transaction_isolation | READ-UNCOMMITTED |
+-----------------------+------------------+

在学习中整理的MySQL事务知识点总结,如有哪里错误不全面,欢迎指正。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值