Согласно MSDN:
http://msdn.microsoft.com/en-us/library/ms191242.aspx
, Когда любой параметры базы данных READ COMMITTED SNAPSHOT или ALLOW SNAPSHOT ISOLATION идет, логические копии (версии) сохраняются для всех модификаций данных, выполненных в базе данных. Каждый раз, когда строка изменяется определенной транзакцией, экземпляр Механизма базы данных хранит версию ранее зафиксированного изображения строки в tempdb. Каждая версия отмечена с порядковым номером транзакции транзакции, которая внесла изменение. Версии измененных строк объединяются в цепочку с помощью списка ссылок. Новейшее значение строки всегда хранится в текущей базе данных и объединяется в цепочку к имеющим версию строкам, сохраненным в tempdb.
Для коротко рабочих транзакций, версия измененной строки может кэшироваться в пуле буферов, не будучи записанным в дисковые файлы базы данных tempdb. Если потребность в имеющей версию строке будет недолгой, это будет просто отброшено от пула буферов и не может обязательно подвергнуться вводу-выводу наверху.
, кажется, существует небольшая потеря производительности для дополнительных издержек, но это может быть незначительно. Мы должны протестировать для проверки.
установка Try эта опция и УДАЛЯЮТ весь NOLOCKs из запросов кода если it’s действительно необходимый. NOLOCKs или использующий глобальные методы в обработчике контекстов базы данных для борьбы с уровнями изоляции транзакции базы данных являются Лейкопластыри к проблеме. NOLOCKS замаскирует основные проблемы с нашим слоем данных и возможно приведет к выбору ненадежных данных, где автоматический выбор / управление версиями строки обновления, кажется, решение.
ALTER Database [StackOverflow.Beta] SET READ_COMMITTED_SNAPSHOT ON
Это делает PNG (на стандартном выводе) циферблата, показывающего текущий время. Он едва умещается в тридцать строк, поэтому код не так чист, как должен быть.
package main
import ("image"; "image/png"; "math"; "bufio"; "os"; "time")
const clock_size = 200;
const radius = clock_size / 3;
var colour image.RGBAColor;
func circle (clock *image.RGBA) {
for angle := float64(0); angle < 360; angle++ {
radian_angle := math.Pi * 2 * angle / 360;
x := radius * math.Sin (radian_angle) + clock_size/2;
y := radius * math.Cos (radian_angle) + clock_size/2;
clock.Set (int (x), int (y), colour);}}
func hand (clock *image.RGBA, angle float64, length float64) {
radian_angle := math.Pi * 2 * angle;
x_inc := math.Sin (radian_angle);
y_inc := -math.Cos (radian_angle);
for i := float64(0); i < length; i++ {
x := i * x_inc + clock_size/2;
y := i * y_inc + clock_size/2;
clock.Set (int (x), int (y), colour);}}
func main () {
clock := image.NewRGBA (clock_size, clock_size);
colour.A = 255;
circle (clock);
time := time.LocalTime ();
hand (clock, (float64(time.Hour) + float64(time.Minute)/60)/12, radius*0.6); // hour hand
hand (clock, (float64(time.Minute) + float64(time.Second)/60)/60, radius*0.8); // minute hand
out := bufio.NewWriter(os.Stdout);
defer out.Flush();
png.Encode(out, clock);
}
Запустить как
8.out > clock.png
Обратите внимание на все эти приведения типа float64? Я' Я НИКОГДА не видел такого строгого языка, как Go about types.
Это тот же код, исправленный в go fix
(и некоторая ручная настройка), а затем автоматически отформатированный с помощью go fmt
. Некоторые символы новой строки вставлены вручную.
package main
import (
"bufio"
"image"
"image/color"
"image/png"
"math"
"os"
"time"
)
const clock_size = 200
const radius = clock_size / 3
var colour color.RGBA
func circle(clock *image.RGBA) {
for angle := float64(0); angle < 360; angle++ {
radian_angle := math.Pi * 2 * angle / 360
x := radius*math.Sin(radian_angle) + clock_size/2
y := radius*math.Cos(radian_angle) + clock_size/2
clock.Set(int(x), int(y), colour)
}
}
func hand(clock *image.RGBA, angle float64, length float64) {
radian_angle := math.Pi * 2 * angle
x_inc := math.Sin(radian_angle)
y_inc := -math.Cos(radian_angle)
for i := float64(0); i < length; i++ {
x := i*x_inc + clock_size/2
y := i*y_inc + clock_size/2
clock.Set(int(x), int(y), colour)
}
}
func main() {
clock := image.NewRGBA(image.Rect(0, 0, clock_size, clock_size))
colour.A = 255
circle(clock)
time := time.Now()
hand(clock, (float64(time.Hour())+float64(time.Minute())/60)/12, radius*0.6) // hour hand
hand(clock, (float64(time.Minute())+float64(time.Second())/60)/60, radius*0.8) // minute hand
out := bufio.NewWriter(os.Stdout)
defer out.Flush()
png.Encode(out, clock)
}
Хорошо, я начну. Вот моя первая программа Go. Это очень примитивный чат-сервер, и он умещается в 30 строк по 80 символов, если я немного его сжал; отформатирован с помощью gofmt
, это 60 строк. Он прослушивает жестко запрограммированный порт (4242), в основном не обрабатывает ошибки и не обрабатывает отключение клиента, кроме прекращения попытки чтения с клиента, если он получает ошибку.
package main
import ("net";"container/vector";"bufio";"strings")
type client struct { conn net.Conn; send chan string; receive chan string }
func main() {
if listener, err := net.Listen("tcp", "0.0.0.0:4242"); err == nil {
master := make(chan string, 100);
clients := vector.New(0);
go runServer(master, clients);
for {
if conn, err := listener.Accept(); err == nil {
c := client{ conn, master, make(chan string, 100) };
clients.Push(c);
go runClient(c);
} else { break } } } }
func runServer(master chan string, clients *vector.Vector) {
for {
message := <-master;
clients.Do(func (c interface{}) { c.(client).receive <- message }); } }
func runClient(c client) {
input := make(chan string, 10);
go readLines(c, input);
for {
select {
case inMessage := <-input: c.send <- inMessage;
case outMessage := <-c.receive: c.conn.Write(strings.Bytes(outMessage));
} } }
func readLines(c client, input chan string) {
reader := bufio.NewReader(c.conn);
for { if line, err := reader.ReadString('\n'); err == nil
{ input <- line; } else { break } } }
Сборка и запуск с:
$ 6g server.go $ 6l -o server server.6 $ ./server
А затем в нескольких других терминалах подключитесь к
$ nc localhost 4242