MySQL事务的原子性

一、事务的ACID特性:

    1)原子性

    2)一致性

    3)隔离性

    4)持久性


二、对于事务的原子性(A)我们知道事务中的操作要么都做要么都不做。对于这一点许多人有错误的理解,我们来看一个例子:

1)

mysql> select * from t4;

+----+------+

| id | name |

+----+------+

|  1 | A    |

|  2 | B    |

|  3 | C    |

+----+------+

3 rows in set (0.00 sec)

2)开启一个事务

mysql> start transaction;

Query OK, 0 rows affected (0.00 sec)


mysql> update t4 set name='AA' where id=1;

Query OK, 1 row affected (0.00 sec)

Rows matched: 1  Changed: 1  Warnings: 0


mysql> update t4 set name='BBBBB' where id=2;

ERROR 1406 (22001): Data too long for column 'name' at row 2


mysql> commit;

Query OK, 0 rows affected (0.03 sec)


mysql> select * from t4;

+----+------+

| id | name |

+----+------+

|  1 | AA   |

|  2 | B    |

|  3 | C    |

+----+------+

3 rows in set (0.01 sec)


结果是不是预想的是不一样的,id=1的记录怎么会执行成功,难道不应该全部回滚吗?


身边有不少的人错误的理解为:事务中有执行错误的语句(error),那么整个事务都会回滚。


3)总结

    我们所说的要么全成功要么全失败,成功与失败取决于我们最后是commit还是rollback。commit将所有的语句执行,rollback将所有的语句执行撤销。

    上面的例子中,我们是commit操作,即便是有错误语句,也会将所有语句执行一次,commit之后将修改的数据刷新到磁盘持久化。所以对于上面的操作我们应该是rollback。

    个人理解:开启一个事务后,错误的语句会被分析器过滤掉,当我们commit的时候对于MySQL来说只有正确的语句(虽然我们知道有条语句是错误的),所以在我们捕捉到异常的时候应当将事务显示的rollback而不是commit。



来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/31549847/viewspace-2199894/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/31549847/viewspace-2199894/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值