关于事务

何为事务?

1.事务是指事务开始到事务结束之间的一组sql语句的操作单元,并且是组内所有sql语句共同完成的业务逻辑。

2.要想使用事务,首先关闭系统自动提交功能(因为系统默认的为自动提交),等待所有在sql语句组中的语句都执行完毕后,再进行手动提交。

关闭系统内自动提交的方式:set autocommit=0;

打开系统自动提交的方式:set autocommit=1;

3..要想事务成功提交,必须是该sql语句组中所有的sql语句都实现,否则该事务提交失败,需手动回滚rollback使数据库回到初识状态。

写到这里,我昨天在项目中遇到一个误区,在这儿我用实例来解释一下:

设计一个事务,同时在student表和teacher表中各添加一条记录?

student表结构:

teacher表结构:

Start transaction;      --开始一个事务

Insert into student values

(‘1315925010’,’刘德华’,’男’,’2016-01-01’,’汉’,’中国’,’M02’,’2016-01-01’);     --该语句插入记录成功

Insert into teacher values

(‘T100’,’林志玲’,’2016-01-01’,’美女讲师’);                  --该语句插入记录失败(插入的字段值列表不够)

Commit;    --手动提交

总结:上面事务虽然执行了,也成功提交了,但是事务成功的前提是要么所有的sql语句都执行,要么都不执行;反过来在观察上面的事务,查看student表的数据时,发现数据插入成功,而查看teacher表数据时却未插入成功,这就破环了事务的原子性,所以该事务是不成立的。

解决方案:只要sql组中任何一条语句未执行成功,我们就不应该提交该事务,而是将数据库回滚或将开始一个新的事务。

Start transaction;      --开始一个事务

Insert into student values

(‘1315925010’,’刘德华’,’男’,’2016-01-01’,’汉’,’中国’,’M02’,’2016-01-01’);     --该语句插入记录成功

Insert into teacher values

(‘T100’,’林志玲’,’2016-01-01’,’美女讲师’);                  --该语句插入记录失败(插入的字段值列表不够)

rollback;           --记住:只要事务中的任意一条sql语句未执行成功,则需手动回滚,不该提交;否则破环事务的原子性。

事务的四大特性:(ACID)

1.原子性:事务sql组中语句要么都执行成功,要么都不执行

2.隔离性:事务之间互不影响

3.一致性:事务执行前后,数据是一致的

4.持久性:事务一旦提交,则永久对数据库产生影响

事务关键字:

打开事务:start transaction;

回滚事务:rollback;

提交事务:commit;

设置数据库提交方式为非自动的:set autocommit=0;设置数据库提交方式为自动的:set autocommit=1;

 

posted @ 2016-04-20 21:50  禁心尽力  阅读(372)  评论(0编辑  收藏  举报