
特性ACID(原子性、一致性、隔离性、持久性)
原子性:原子性是指事务包含的所有 *** 作要么全部成功,要么全部失败回滚,,因此事务 *** 作如果成功就必须要完全应用到数据库,如果 *** 作失败则不能对数据库有一点影响。
一致性:一致性是指事务必须使数据库从一个一致性状态转换到另一个一致性状态,就是说事务执行前后都必须处在一致性状态。
隔离性:隔离性使当多个用户访问数据库时,比如 *** 作同一张表,数据库开启的每一个事务,不能被其它事务干扰,多个并发事务之间相互隔离。
持久性:持久性是指一个事务一旦提交,对数据库中数据的改变是永久的,即使是数据库系统遇到故障也不会丢失提交的事务 *** 作。
什么是事务?事务是逻辑上的一组 *** 作,组成这组 *** 作的各个单元,要不全都成功要不全都失败,这个特性就是事务
注意:mysql数据支持事务,但是要求必须是innoDB存储引擎
解决这个问题:
mysql的事务解决这个问题,因为mysql的事务特性,要求这组 *** 作,要不全都成功,要不全都失败,这样就避免了某个 *** 作成功某个 *** 作失败。利于数据的安全
如何使用:
(1)在执行sql语句之前,我们要开启事务 start transaction
(2)正常执行我们的sql语句
(3)当sql语句执行完毕,存在两种情况:
1,全都成功,我们要将sql语句对数据库造成的影响提交到数据库中,committ
2,某些sql语句失败,我们执行rollback(回滚),将对数据库 *** 作赶紧撤销
(注意:mysql数据支持事务,但是要求必须是innoDB存储引擎)
mysql>create table bank(name varchar(20),money decimal(5,1))engine=innodb defau
lt charset=utf8
mysql>inset into bank values('shaotuo',1000),('laohu',5000)
mysql>select*from bank
+---------+--------+
| name | money |
+---------+--------+
| shaotuo | 1000.0 |
| laohu | 5000.0 |
+---------+--------+
------没有成功“回滚”执行rollback
mysql>start transaction//开启事务
Query OK, 0 rows affected (0.00 sec)
mysql>update bank set money=money+500 where name='shaotuo'
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql>update bank set moey=money-500 where name='laohu'
ERROR 1054 (42S22): Unknown column 'moey' in 'field list'
mysql>rollback//只要有一个不成功,执行rollback *** 作
Query OK, 0 rows affected (0.01 sec)
mysql>select*from bank
+---------+--------+
| name | money |
+---------+--------+
| shaotuo | 1000.0 |
| laohu | 5000.0 |
+---------+--------+
------成功之后 进行commit *** 作
mysql>start transaction//开启事务
Query OK, 0 rows affected (0.00 sec)
mysql>update bank set money=money+500 where name='shaotuo'
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql>update bank set money=money-500 where name='laohu'
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql>commit//两个都成功后执行commit(只要不执行commit,sql语句不会对真实的数据库造成影响)
Query OK, 0 rows affected (0.05 sec)
mysql>select*from bank
+---------+--------+
| name | money |
+---------+--------+
| shaotuo | 1500.0 |
| laohu | 4500.0 |
+---------+--------+
事务的使用场景是很广泛的,举个简单的例子有个买东西的网站,你下单买了某个货品,那么数据库中的订单表会插入一条你下单的记录,同时货物表需要把你所购买货品的数量进行更新,候新增订单和更新货品数量必须是一致的,不应该出现有人下了单但是货品数量不变,也不应该货品数量减少了而订单却没有新增这种情况发生
那么插入订单信息和更新货品数量就是一个完整的事务,要么都执行成功,如果两个 *** 作中有任意一个 *** 作失败,则整个流程就应该是失败的,已经执行的 *** 作就应当回滚
在数据库中使用事务,可以保证多个数据库 *** 作的一致性
这就是一个简单的事务的使用场景
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)