事务,就是把一堆事情绑在一起做,都成功了才算完成,否则就恢复之前的样子 举例:银行ATM取钱,扣款成功后突然停电了,吐钱的操作还没做完,这时候ATM机就要恢复到没取钱时候的状态,否则钱扣了还没拿到手,这多难受呀,所以这就需要用到事务,如果是扣款成功后突然停电,此时应该回滚所有的事务,撤消扣款。
事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所做的所有更改都会被撤消。也就是事务具有原子性,一个事务中的一系列的操作要么全部成功,要么一个都不做。 事务的结束有两种,当事务中的所有步骤全部成功执行时,事务提交。如果其中一个步骤失败,将发生回滚操作,撤消之前到事务开始时的所有操作。

事务所具有的特点
A.原子性:
原子是自然界中最小的颗粒,具有不可再分的特点 事物中的所有操作可以看作是一个原子(事务是数据库的逻辑工作单位),要么全部执行,要么全不执行.

B.一致性:
事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态.因此当数据库只包含成功事务提交的结果时,就说数据库处于一致性状态.如果数据库系统 运行中发生故障,有些事务尚未完成就被迫中断,这些未完成事务对数据库所做的修改有一部分已写入物理数据库,这时数据库就处于一种不正确的状态,或者说是 不一致的状态 .

C.隔离性:
隔离性指各个事务的操作是互不干扰的,即一个事务内部的操作及使用的数据对其它并发事务是隔离的,并发执行的各 个事务之间不能互相干扰.

D.持久性:
也称永久性,指一个事务一旦提交,它对数据库中的数据的改变就应该是永久性的.接下来的其它操作或故障不应该对其执行结果有任何影响.

首先我们要开启事务
Tx, _ := Db.Begin()
中间的是mysql操作
error := Tx.Commit()
这期间可写若干mysql操作
若期间发生问题
就回滚一下
tx.Rollback()
fmt.println("操作失败")

具体代码实现:

package main

import (
    "database/sql"
    "fmt"
    _ "mysql"
)

func shiwu(id int, username string, password int, Db *sql.DB) error {
    Tx, _ := Db.Begin()

    stmt, _ := Db.Prepare("INSERT INTO Student(Id,Username,Password) VALUES(?,?,?)")
    result, _ := stmt.Exec(id, username, password)
    fmt.Println(result)
    stmt1, _ := Db.Prepare("DELETE FROM post WHERE id=?")
    result, _ = stmt1.Exec(6)
    error := Tx.Commit()
    return error

}

func main() {
    var Db *sql.DB
    Db, err := sql.Open("mysql", "root:123456@tcp(192.168.24.131:3306)/practise")
    if err != nil {
        panic(err.Error())
    } else {
        err = shiwu(6, "yuchao", 456789, Db)
        fmt.Println(err)
    }

}
Last modification:June 28th, 2019 at 01:34 pm
如果觉得我的文章对你有用,请随意赞赏