事务

什么是事务

事务是逻辑上的一组操作,要么都成功,要么都失败

为什么需要事务

很多时候一个数据操作,不是一个sql语句就完成的,可能有很多个sql语句,如果部分sql执行成功而部分sql执行失败将导致数据错乱!

例如转账操作,

1.从原有账户减去转账金额

2.给目标账户加上转账金额

若中间突然断电了或系统崩溃了,钱就不翼而飞了!

使用事务

start transaction; --开启事物,在这条语句之后的sql将处在同一事务,并不会立即修改数据库

commit;--提交事务,让这个事物中的sql立即执行数据的操作,

rollback;--回滚事务,取消这个事物,这个事物不会对数据库中的数据产生任何影响

案例:转账过程中发生异常

#准备数据
create table account(
    id int primary key auto_increment,
    name varchar(20),
    money double
);
insert into account values(1,'赵大儿子',1000);
insert into account values(2,'刘大牛',1000);
insert into account values(3,'猪头三',1000);
insert into account values(4,'王进',1000);
insert into account values(5,'黄卉',1000);

 

#使用事务在mysql使用,正确在执行,再提交。

回滚

python事务的体现

python的pymysql模块中一切代码其实都是在事务的前提下实行的,所以才有commit和rollback的功能。

 

import pymysql

conn = pymysql.connect(
    user = "root",
    password = "root",
    database = "day48"
)
#创建游标
cur = conn.cursor(pymysql.cursors.DictCursor)

sql1 = "update account set money = money-100 where id = 2"
sql2 = "update account set moneys = money +100 where id = 1"


try:
    cur.execute(sql1)
    cur.execute(sql2)
    conn.commit()
    print("修改成功")
except Exception:
    conn.rollback()
    print("修改失败")

 

结果:修改失败

 注意:事务的回滚的前提是能捕捉到异常,否则无法决定何时回滚,Python中很简单就实现了,另外mysql中需要使用存储过程才能捕获异常!

事务的四个特性:

原子性:

事务是一组不可分割的单位,要么同时成功,要么同时不成功。

一致性:

事务前后的数据完整性应该保持一致,(数据库的完整性:如果数据库在某一个时间点先,所有数据都符合所有约束,则称数据库为完整性的状态)

隔离性:

事务的隔离性是多个用户并发访问数据时,一个用户的事务不能被其他的用户的事务所干扰,多个并发事务之间数据要相互隔离

持久性

持久性是指一个事务一旦被提交,它对数据的改变就是永久的,接下来即使数据库发生故障也不应该对其有影响。

事务对用户的隔离级别

数据库使用者可以控制数据库工作在哪个级别下,就可与防止不同的隔离性问题

read uncommitted --不做任何隔离,可能脏读,幻读

read committed----可以防止脏读,不能防止不可重复读,和幻读,

Repeatable read --可以防止脏读,不可重复读,不能防止幻读

Serializable--数据库运行在串行化实现,所有问题都没有,就是性能低

修改隔离级别:

select @@tx_isolation;--查询当前级别

set[session|global] transaction isolation level .... ;修改级别

实例:

set global transaction isolation level Repeatable read ;

 

posted @ 2018-11-26 18:11  msjaxuexi  阅读(106)  评论(0编辑  收藏  举报